一種利用執行緒池進行for迴圈處理的思想

2021-07-30 03:59:24 字數 1104 閱讀 2830

在for裡面,如果執行一次for裡面的內容所需時間「較長」(相對而言),不妨改用執行緒池的方式。

如下測試:

public class executortest2   

public void m1() catch (exception e)

} };

pool.execute(run);

} system.out.println("[1] done!");

pool.shutdown();

} public void m2() catch (exception e)

} system.out.println("[2] done!");

} }

列印結果:

[1] done!

[1]耗時:6ms

[1]pool-1-thread-9

[1]pool-1-thread-7

[1]pool-1-thread-2

[1]pool-1-thread-1

[1]pool-1-thread-3

[1]pool-1-thread-4

[1]pool-1-thread-6

[1]pool-1-thread-5

[1]pool-1-thread-10

[1]pool-1-thread-8

[2]main

[2]main

[2]main

[2]main

[2]main

[2]main

[2]main

[2]main

[2]main

[2]main

[2] done!

[2]耗時:10005ms

由列印結果可知:m1方法是用到了多執行緒的,多執行緒此時被執行緒池管理;而m2方法始終是main主線程執行的。

採用先把要執行的「耗時」內容放到乙個執行緒的執行主體(run方法)裡面,再用執行緒池執行該執行緒,可大大減少for迴圈的耗時。但這種情況不適合for次數較大的情形,因為每迴圈一次,就開闢乙個執行緒,開銷較大。注意這種不叫高併發,只是相當於原來由乙個工人幹的活現在由多個工人協作完成一樣。

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

先上類圖 1.worker為處理任務的執行緒,不斷獲取新任務執行 2.task為任務例項,可以設計為一次性的或者迴圈執行 3.executorpool維護著執行緒池和任務池。3.1 內部負責worker的生成和銷毀,task的分發 對外提供task的增加。3.2 mutex 為互斥變數,實現對tas...

迴圈佇列一種實現

queue實現方式有兩種 陣列和鍊錶,本文屬於陣列實現,為了防止佇列出現 明明還有儲存空間,但是卻提示佇列已滿 的情況,故使用迴圈佇列 include include define max size 5 typedef struct qnode squeue,squeueptr void init ...

記憶體池的一種實現

include include include include include const.h include utilityfunc.h include hashtable.h include logmsg.h define system page size 4096 define default...