1
作爲練習,我寫了下面的代碼練習生產者/消費者模式:爲什麼我的Producer Consumer程序結束了?
public class Producer implements Runnable {
BlockingQueue<Entity> entities;
public Producer(BlockingQueue<Entity> entities) {
this.entities = entities;
}
@Override
public void run() {
for (int i = 0; i <= 20; i++) {
Entity en = new Entity();
System.out.println("Producing entity: " + Integer.toString(i));
en.setName(Integer.toString(i));
entities.add(en);
}
}
}
public class Consumer implements Runnable {
BlockingQueue<Entity> entities;
public Consumer(BlockingQueue<Entity> entities) {
this.entities = entities;
}
@Override
public void run() {
try {
while (true) {
System.out.println("Consuming entity: "
+ entities.take().getName());
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class MainPCClass {
BlockingQueue<Entity> entities = new LinkedBlockingQueue<Entity>(5);
public void start(){
//start the producer
new Thread(new Producer(entities)).start();
//start the consumer
new Thread(new Consumer(entities)).start();
}
}
我預計,鑑於一段時間(真)以上的消費者,我的計劃從來沒有結束,消費者線程被阻塞因爲在製片人製作完所有內容之後隊列是空的。這是爲什麼?我錯過了什麼嗎?難道我做錯了什麼?我的程序運行並非常順利地結束。
您的期望是合理的 - 您如何運行您的程序?有什麼打印出來的? – assylias
你的方法啓動線程在哪裏? – Aaron
從看它,製片人應該增加20個工作,然後完成。消費者會在第20份工作後阻止,等待下一份工作。你得到的輸出是什麼? –