背景
我打算制作一個每分鐘運行一次的調度程式。無論何時運行,都會給出不同的目標資料,每次可能需要大約 90 秒才能繼續。
我的計劃
程序是這樣的:
multiple producers(threads) :
1. get data from some API
2. using data from 1. parse given data
3. put it into a common queue
↓
common queue
↓
multiple consumers(threads) :
1. get data from the queue
2. call some API
3. then insert into RDB
(每個資料的順序無關緊要)
如果我理解正確,當用戶執行緒正在運行時,主執行緒可能會更早完成并且行程將繼續運行直到這些用戶執行緒完成。
問題/疑問
我希望每個行程都有自己的公共佇列,僅用于來自同一行程的執行緒。也希望在每個行程完成時釋放某些佇列的記憶體。
我的意思是,可能像下面這樣嗎?:
- 運行行程A,只有來自A的執行緒才能訪問佇列X。
- 正在運行行程 B,只有來自 B 的執行緒才能訪問佇列 Y。
- 關閉行程A,釋放佇列X的記憶體。
- 正在運行行程 C,只有來自 C 的執行緒才能訪問佇列 Z。
- 關閉行程B,釋放佇列Y的記憶體。
- 關閉行程C,釋放佇列Z的記憶體。
這是我第一次處理多執行緒。先感謝您!:)
uj5u.com熱心網友回復:
只需考慮使用java.lang.TreadLocal<T>.
參考自 JavaDoc:
只要執行緒處于活動狀態并且可以訪問 ThreadLocal 實體,每個執行緒都持有對其執行緒區域變數副本的隱式參考;執行緒消失后,它的所有執行緒本地實體副本都將進行垃圾回收(除非存在對這些副本的其他參考)。
uj5u.com熱心網友回復:
我會這樣設計:使用分配給自己佇列的“工人”的“執行緒池”。“Worker”是一個類,它擴展了一個執行緒并對其佇列有一個私有參考。所以,Workers 的執行緒池實際上是一組執行緒都監聽同一個佇列。然后你可以定義一個擴展 Worker 的 ProducerWorker。這些生產者作業人員將處理 API 并放入他們的公共佇列中。同樣,ConsumerWorker 是作業池中的作業人員,它處理來自它所參考的公共佇列中的消費“任務”。在此設計中,您對執行緒“型別”(不同的作業執行緒)進行了邏輯分離,因此您可以進行更通用的分離,而不僅限于不同的行程。這就是設計。要實作,您需要閱讀有關執行緒池和擴展執行緒的資訊。
例子:
ExecutorService poolAlpha = Executors.newFixedThreadPool(10);
ExecutorService poolBeta = Executors.newFixedThreadPool(10);
poolAlpha.submit( alphaWorker );
poolBeta.submit( betaWorker );
下面是基本 Worker 應該是什么樣子的偽代碼:
class Worker extends Thread {
private Queue myCommonQueue;
private Runnable myWork;
// to know when to stop the thread.
private boolean isRunning = true;
// Constructor
public Worker(Queue queue, Runnable work) {
this.myCommonQueue = queue;
this.myWork = work;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/318745.html
