2013-09-22 60 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。

相關問題