我编写了一个程序,其中一个线程用于向其中插入元素Deque
,另一个线程用于从相同线程中读取元素Deque
。为此,我这样做
public class ThreadCommunicationInDeque {
public static void main(String args[])
{
Deque deque=new LinkedList<>();
InsertingThread it=new InsertingThread(deque);
ReadingThread1 rt=new ReadingThread1(deque);
it.start();
rt.start();
}
}
class InsertingThread extends Thread{
Deque deque=new LinkedList<>();
InsertingThread(Deque deque){
this.deque=deque;
}
@Override
public void run(){
for(int i=0;i<50;i++){
try {
deque.add(i);
System.out.println(deque.getLast());
Thread.sleep(100);
} catch (InterruptedException ex) {
Logger.getLogger(InsertingThread.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
class ReadingThread1 extends Thread{
Deque deque=new LinkedList<>();
ReadingThread1(Deque deque){
this.deque=deque;
}
@Override
public void run(){
if(deque.isEmpty()){
System.out.println("No elements in queue");
}else
{
System.out.println(deque.getLast());
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
Logger.getLogger(ReadingThread1.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
我的问题是这里InsertingThread
工作正常,但ReadingThread
通过显示No停止elements in queue
。我没有走错地方,谁能告诉我如何解决。并告诉我,有什么更好的方法吗?
这是因为您没有像线程那样在循环中运行使用者。它只运行一次,就可以看到队列中没有元素(如果说消费者是第一个运行的线程,则可能是正确的),然后安全地从该线程退出。
首先尝试使用消费者的run方法中的某些方法,然后根据需要对其进行微调:
while (true) {
if (deque.isEmpty()) {
System.out.println("No elements in queue");
} else {
System.out.println("consumed " + deque.removeLast());//note get will still have queue populated so remove seems better?
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
}
}
}
顺便说一句,您不必在生产者和消费者中创建出队实例。您只需删除实例即
Deque<Integer> deque = new LinkedList<Integer>();
到
Deque<Integer> deque;
如果您只想显示线程中的最后一个元素(不过您可以只通过main方法显示它),则可以通过在主对象中调用如下所示的join方法(这样,它可以使生产者完成然后启动使用者线程)来完成该操作方法:
public static void main(String args[]) throws InterruptedException {
Deque<Integer> deque = new LinkedList<Integer>();
InsertingThread it = new InsertingThread(deque);
ReadingThread1 rt = new ReadingThread1(deque);
it.start();
it.join();
rt.start();
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句