java - 如何使用deque进行线程通信?

标签 java multithreading deque

我编写了一个程序,其中一个线程用于将元素插入到 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();
}

关于java - 如何使用deque进行线程通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27055533/

相关文章:

java - 我们如何获得有关系统剪贴板事件的通知?

java - Hibernate 组合实体

c# - lock(locker) 和 lock(variable_which_I_am_using) 的区别

Java - 在中间或除双端队列前端/末尾以外的任何位置插入元素

java - 登录端点?

java - 如何使用java反转句子中的单词

android - 单声道安卓 : terminate thread in onPause() state

通过 Cron 的 PHP 并发

algorithm - 随机队列实现 - 随机性的想法

c++ - 用C++实现LRU缓存