先上類圖:
1. worker為處理任務的執行緒,不斷獲取新任務執行
2.task為任務例項,可以設計為一次性的或者迴圈執行
3. executorpool維護著執行緒池和任務池。
3.1 內部負責worker的生成和銷毀,task的分發;對外提供task的增加。
3.2 mutex:為互斥變數,實現對tasks和workers的互斥操作。
3.3 execute:是對外的唯一介面,負責增加任務。
3.4 gettask:負責向worker提供任務,從tasks佇列中取。如果沒有則等待一定時間,依然沒有則返回null。
3.5 addworker:當前執行緒數不能滿足對任務的處理,造成任務阻塞過多,則新起worker。
再上**:
worker
void worker::run()
pool->workerdone(this);
}
注:不斷的從pool中獲取任務,獲取不到則銷毀該執行緒。
task
void task::run()
void task::run()
}
executorpool
注:佇列中有任務,則返回最早進來的任務。沒有,則等待一段時間,等待成功返回新任務;否則返回nullprivate worker executorpool::addworker(const task& firsttask)
task executorpool::gettask() else
}}if (t)
return null;
}}
void executorpool::execute(const task& command)
if (tasks.size() < workers.size())
} else
}
bool executorpool::waitfornewtask()
注:等待新任務,如果有任務加入,呼叫notify通知,則返回true;如果是等待超時,則返回false。worker獲得false,則會銷毀該執行緒。 通過執行緒池處理多工
每隔1000ms去查詢一次待辦任務 timer.schedule new timertask for final invoiceonlinerequestinfodo requestinfodo invoiceonlinerequestinfodolist try catch exception e...
執行緒池多工的執行順序
執行緒池場景 面試官 假設我們有乙個執行緒池,核心執行緒數為10,最大執行緒數也為20,任務隊列為100。現在來了100個任務,執行緒池裡現在有幾個執行緒執行?粉絲豪 應該是10吧。面試官 你確定?粉絲豪 確定啊,就是10 於是乎,粉絲豪就回去等通知了 其實這道題正確的答案是 不一定!因為並沒指明是...
一種利用執行緒池進行for迴圈處理的思想
在for裡面,如果執行一次for裡面的內容所需時間 較長 相對而言 不妨改用執行緒池的方式。如下測試 public class executortest2 public void m1 catch exception e pool.execute run system.out.println 1 d...