В качестве упражнения, я написал следующий код на практике 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 рабочих мест, ожидая следующего. Какой результат вы получаете? –