如何使用双端队列进行线程通信?

拉古

我编写了一个程序,其中一个线程用于向其中插入元素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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章