2013-09-22 3 views
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(); 
    } 
} 

Я ожидаю, что, учитывая время (правда) выше в потребителе, моя программа никогда не заканчивается, и потребитель поток блокируется поскольку очередь пуста после того, как производитель произвел все. Почему это? Я что-то упускаю? Я делаю что-то неправильно? Моя программа работает и заканчивается очень гладко.

+0

Ваше ожидание разумно - как вы запускаете свою программу? Что-нибудь распечатано? – assylias

+0

Где ваш метод, который запускает потоки? – Aaron

+0

, глядя на него, продюсер должен добавить 20 заданий, а затем закончить. Потребитель будет блокировать после 20 рабочих мест, ожидая следующего. Какой результат вы получаете? –

ответ

0
  • Ваша программа никогда не останавливается, поскольку используемые вами потоки не являются потоками демона. JVM завершит работу только в том случае, если все оставшиеся потоки являются потоками демона.

  • При запуске вашей программы вы потенциально получите IllegalStateException: Queue full, так как производитель превысит предел 5, который вы установили для этого списка.

Смежные вопросы