一種處理多工的執行緒池設計

2021-06-09 21:16:46 字數 1222 閱讀 6527

先上類圖:

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

private worker executorpool::addworker(const task& firsttask)task executorpool::gettask()  else}}

if (t)

return null;

}}

注:佇列中有任務,則返回最早進來的任務。沒有,則等待一段時間,等待成功返回新任務;否則返回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...