在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...