我無法理解Synchronous Queue的工作原理。
我的理解是,任務的切換是直接對線程進行的,但構造函數沒有像其他API那樣的最大線程數限制。
所以當一個put
或offer
完成它基本上傳遞給另一個線程或不是?
所以,如果我做,例如100 put
它將被傳遞給100個線程?
我試圖讀取源代碼,但無法弄清楚會發生什麼。它似乎創建了一個鏈接的節點列表,其中每個節點封裝一個線程,但是如何維護這個列表,例如展開/縮小等,以及踏板如何運行這些任務對我而言並不清楚。
那麼這個列表是否擴展,因爲我們提供任務?結果消費者線程(服務員)不斷增加?
這些是否被重用?或者只是執行一些並停止?同步隊列是否在每個offer/put上創建線程?
1
A
回答
4
這聽起來像你誤解SynchronousQueue
的目的。
SynchronousQueue
不會創建任何線程。 當您撥打put
時,put
不會完成,直到另一個線程(您創建的線程)從SynchronousQueue
中取出該元素。
「如果我做如100 put
」如果你有一百個線程,每個線程調用同一SynchronousQueue
put
,那麼所有這些線程將等待,直到其他線程開始take
這些元素了。如果您有一個線程,則一次只能執行一個put
,並且每次都會等待另一個線程在添加另一個線程之前採用該元素。
內部使用的列表是一個鏈接列表,它擴展並像鏈接列表一樣得到GC'd。
2
據我所知,這個想法是,任務切換是直接線程 但構造不具備的 線程像其他的API綁定e.g最大數量。
隊列實現的構造函數中所有int參數的第一個參數是SIZE
,而不是線程數。
那麼當我們提供任務時這個列表是否擴展?因此,消費者線程(服務員)不斷增加?
同步隊列用於切換目的。來自生產者的put()
調用將阻塞,直到有一位消費者從隊列中執行take()
。這與線程的數量無關。消費者線程不一定要增加。一旦消費者完成了一條消息的處理,它可以再次從隊列中取一個()。
public class MyWorker extends Thread {
private final BlockingQueue<String> queue;
public MyWorker(BlockingQueue<String> queue) {
this.queue = queue;
}
public void run() {
try {
while (true) {
String s = queue.take();
doWork(s);
}
}
catch (InterruptedException ie) {
// just terminate
}
}
}
public class SyncQueueExample {
// …
public SyncQueueExample() {
try {
int workItem = 0;
// Create a synchronous queue
BlockingQueue<String> queue = new SynchronousQueue<String>();
// Create the child worker thread
MyWorker worker = new MyWorker(queue);
worker.start();
// Start sending to the queue
while (true) {
System.out.println("\nPlacing work on queue");
String work = "Work Item:" + (++workItem);
queue.put(work);
}
}
catch (Exception e) {
e.printStackTrace();
}
}
}
輸出:運行時,隊列生產者和消費者之間的輸出將是 「協調」,在效果,和備用這樣:
Placing work on queue
Thread 'Thread-1' processing work: Work Item:1
Placing work on queue
Thread 'Thread-1' processing work: Work Item:2
Placing work on queue
Thread 'Thread-1' processing work: Work Item:3
Placing work on queue
Thread 'Thread-1' processing work: Work Item:4
相關問題
- 1. C#線程隊列同步
- 2. 使用兩個隊列同步線程
- 3. 同步隊列在多線程
- 4. Java中是否存在同步隊列?
- 5. 創建一個線程隊列
- 6. 浴室同步和線程隊列
- 7. 最佳線程同步隊列
- 8. python線程與同步隊列
- 9. 每K步兩個線程同步
- 10. 在線程之間創建「同步點」
- 11. 是否建議爲每個客戶端請求創建線程?
- 12. 不是ruby隊列線程安全爲什麼隊列不同步?
- 13. tomcat是否爲每個用戶創建一個線程?
- 14. jmx是否爲每個調用創建一個新線程?
- 15. 使用消息隊列的線程同步不是爲了
- 16. Swift異步HTTP請求是否創建另一個線程?
- 17. 同步方法是否在UI線程(Android)的不同線程上運行?
- 18. 同步隊列
- 19. Python - 線程 - 我可以創建線程隊列列表嗎?
- 20. 單獨同步兩個線程隊列並阻止執行?
- 21. PyZMQ是否爲每個新客戶端連接創建線程?
- 22. 我是否必須pthread_join創建每個線程?
- 23. 是否必須在主線程上執行GCD主隊列?
- 24. 線程在阻塞後是否退出每個同步的方法或對象?
- 25. 如何在Qt隊列中創建多個線程?
- 26. 如何在Delphi Xe2中創建一個線程隊列?
- 27. 駱駝是否爲每條路線創建線程
- 28. FIFO隊列同步
- 29. 線程池中每個線程的隊列
- 30. 每個RMI請求是否在服務器端創建一個新線程?
如果我的其中一個線程接收到另一個線程放入的數據,那麼鏈表需要什麼? – Jim
需要的是你可能有100個線程,每個線程都有一個等待被佔用的元素。 –
所以,如果我有'X'線程需要採取這個隊列的工作,我怎麼能根據負載調整'X'號碼?即相應地增加/減少它們? – Jim