帶有隊列的生產者/消費者執行緒
簡介:
實現生產生產產品>實作生產者/消費者線程模型需要建立一個隊列來促進生產者和消費者線程之間的通訊。本文提出了兩種實現此類隊列的替代方法,並評估了它們的相對優點。
方法 1:
在第一種方法中,使用共享 QueueHandler 類生產者和消費者。此類封裝了線程安全的內部 Queue 實現,並提供了使物件入隊和出隊的方法。生產者和消費者執行緒無法直接存取佇列;相反,它們依賴 QueueHandler 與之互動。
public class QueueHandler { public static Queue<Object> readQ = new Queue<Object>(100); public static void enqueue(Object object) { // do some stuff readQ.add(object); } public static Object dequeue() { // do some stuff return readQ.get(); } }
方法 2:
在第二種方法中,每個生產者和消費者執行緒都有自己的引用到共享佇列。這消除了對 QueueHandler 類別的需要。
public class Consumer implements Runnable { Queue<Object> queue; public Consumer(Queue<Object> readQ) { queue = readQ; Thread consumer = new Thread(this); consumer.start(); } } public class Producer implements Runnable { Queue<Object> queue; public Producer(Queue<Object> readQ) { queue = readQ; Thread producer = new Thread(this); producer.start(); } }
評估:
兩種方法都有其優點和缺點:
方法1:
優點:
缺點:
缺點是引入額外的級別,可能會增加開銷。
接近2:
優點:
缺點:
缺點:依賴消費者正確處理線程安全。 讓監控與控制與系統的互動變得更加困難結論:實現生產者/消費者隊列的最佳方法取決於應用程式的特定要求。如果需要高階的執行緒安全性和抽象性,建議使用方法 1。如果性能更重要,方法 2 可能更可取。以上是哪種方法更適合實現生產者/消費者隊列:使用共享的 QueueHandler 類別或為每個執行緒提供自己的隊列引用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!