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