Java中的SynchronousQueue範例-解決Producer Consumer問題
SynchronousQueue是一種特殊類型的BlockingQueue,其中每個插入操作都必須等待另一個執行緒中對應的刪除命令,反之亦然。當您在 SynchronousQueue 上呼叫put() 方法時,它會阻塞,直到另一個執行緒從中取得該元素。因此,如果另一個執行緒嘗試從中刪除一個元素,但該元素不存在,則該執行緒會阻塞,直到另一個執行緒將該元素放入佇列中。你可以把 SynchronousQueue 想像成一個拿著奧運火炬奔跑的運動員(線程),他帶著火炬(正在傳遞的對象)奔跑,並將其傳遞給另一邊等待的另一位運動員。如果你留意這個名字,你就會明白 SynchronousQueue 如此命名是有原因的;它同步地將資料傳輸到另一個執行緒;它等待某人獲取數據,而不是僅僅將其放入並退出(非同步操作)。如果您熟悉 CSP 和 Ada,那麼您就會知道同步佇列類似於執行緒的會議。它們非常適合控制傳輸結構,其中一個執行緒中運行的物件必須與另一個執行緒中的物件同步,以便向其傳遞一些資訊、事件或任務。在先前的多執行緒程式設計教學中,我們學習如何使用wait和notify以及BlockingQueue方法來解決生產者-消費者問題。現在我們將學習如何使用 SynchronousQueue 應用生產者-消費者模式。此類還支援對生產者線程和消費者線程的等待進行排序的公平行為。預設情況下,不保證此順序。但是,使用公平屬性建立的佇列可保證 FIFO (先進先出)佇列 中執行緒的存取。Java 中使用 SynchronousQueue 的生產者/消費者。

import java.util.concurrent.SynchronousQueue; /** * Java Program to solve Producer Consumer problem using SynchronousQueue. A * call to put() will block until there is a corresponding thread to take() that * element. * * @author Javin Paul */ public class SynchronousQueueDemo{ public static void main(String args[]) { final SynchronousQueue
queue = new SynchronousQueue
(); Thread producer = new Thread("PRODUCER") { public void run() { String event = "FOUR"; try { queue.put(event); // thread will block here System.out.printf("[%s] published event : %s %n", Thread .currentThread() .getName(), event); } catch (InterruptedException e) { e.printStackTrace(); } } }; producer.start(); // starting publisher thread Thread consumer = new Thread("CONSUMER") { public void run() { try { String event = queue.take(); // thread will block here System.out.printf("[%s] consumed event : %s %n", Thread .currentThread() .getName(), event); } catch (InterruptedException e) { e.printStackTrace(); } } }; consumer.start(); // starting consumer thread } } Output: [CONSUMER] consumed event : FOUR [PRODUCER] published event : FOUR
new SynchronousQueue(boolean fair).
關於 Java 中的 SynchronousQueue,您需要記住什麼。
以下是 Java 中這種特殊類型的阻塞佇列的一些重要屬性。以同步方式將資料從一個線程傳遞到另一個線程非常有用。該隊列沒有容量並且被阻塞,直到另一個執行緒釋放它。
- SynchronousQueue 會阻塞,直到一個執行緒準備好取得資料為止,另一個執行緒將嘗試放入資料。
- SynchronousQueue 沒有磁碟區。也就是說,它不包含數據。
- SynchronousQueue 用於實現前向排隊策略,其中線程將控制權傳遞給等待線程,或在允許的情況下建立新線程,否則不轉移控制權。
- 該隊列不允許空資料。嘗試新增 null 元素將會拋出NullPointerException。
- 如果您使用 Collection 中的其他方法(例如 contains),SynchronousQueue 的行為就像一個空集合。
- 您不能使用 SynchronousQueue 的 peek 方法,因為該元素僅在您嘗試刪除它時才存在;此外,在另一個執行緒嘗試刪除元素之前,您將無法插入元素(使用任何方法)。
- 您將無法對 SynchronousQueue 使用迭代器,因為... 它沒有元素。
- SynchronousQueue 可以使用公平規則創建,其中保證按 FIFO 順序存取執行緒。
GO TO FULL VERSION