国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

Java并發編程 - 線程池

2019-11-06 06:18:27
字體:
來源:轉載
供稿:網友

線程池是一種生產者/消費者模式的實現.

線程池處理任務的流程

ThreadPoolExecutor是一種線程池的實現, 它執行execute()的處理流程如下:

threadpoolexecutor-process

上圖中與新創建線程有關的步驟都需要獲取全局鎖, 所以線程池中應當盡量避免進行新線程的創建. 實際上在ThreadPoolExecutor完成預熱之后(corePoolSize已滿)的時候, 幾乎所有的execute()方法都是執行入隊操作. 這樣就避免了全局鎖的獲取(注意: 并不是說入隊不需要獲取鎖, 只是這時候獲取的不是全局鎖而已).

線程池的使用

線程池的創建

可以通過ThreadPoolExecutor來創建一個線程池:

new ThreadPoolExecutor( corePoolSize, // 線程池的基本大小, 小于此數值時僅新建線程 maximumPoolSize, keepAliveTime, // 線程池的工作線程空閑時, 保持存活的時間. milliseconds, runnableTaskQueue, // 任務隊列, 需要使用阻塞隊列 handler); // 當線程池和隊列都滿了的時候的丟棄策略

向線程池提交任務

兩種方法:

使用execute(), 適用于提交不需要返回值的任務, 所以也無法判斷任務是否被線程池執行成功;

threadPool.execute(new Runnable() { @override public void run() { // 這里是具體的代碼 }});

使用submit(), 適用于提交需要返回值的任務, 會返回一個Future類型的對象, 用于判斷任務是否執行成功. 可以通過Future對象的get()方法來獲取返回值. get()會阻塞當前線程直到任務完成.

Future<Object> future = threadPool.execute(hasReturnValueTask);try { Object o = future.get();} catch(Exception e) {} finally { threadPool.shutdown();}

關閉線程池

通常調用shutdown()方法來關閉線程池, 確保所有正在執行的任務都正常完成;

如果當前任務不一定要執行完, 也可以使用shutdownNow()來進行.

合理的配置線程池

以下以CPU的總核心數為n來計算

核心線程數

需要根據任務的性質來具體劃分

如果是計算密集型任務(也就是CPU密集型任務, 大量快速執行的小任務), 則配置n+1個線程, 充分利用CPU的計算能力.如果是IO密集型任務, 則單任務的等待時間長, 則應該配置盡可能多的線程, 比如2*n如果是混合型的任務, 則可以配置兩個不同規模的線程池, 也可以使用優先級隊列, 讓執行時間短的任務先執行;

隊列的選擇

可以使用優先級隊列PRiorityBlockingQueue來處理, 讓優先級高的任務先執行.

另外, 建議使用有界隊列, 因為在遇到IO問題時, 有界隊列只會發出拋棄任務的異常, 但如果使用了無界隊列, 則有可能不斷創建線程, 最終導致內存溢出, 影響其他線程.

線程池的監控

監控線程池的運作方便在出現問題時, 可以根據線程池的使用狀況快速定位問題, 也有利于進行調優. 在監控線程池的時候有如下屬性:

taskCount: 需要執行的任務量;completedTaskCount: 已完成的任務量, 小于等于taskCount;largestPoolSize: 池中的歷史最大線程數量, 可以據此判斷線程池是否滿過, 也就是是否用過隊列;getPoolSize: 得到線程池的當前線程數量, 只增不減的一個值.getActiveCount: 獲取活動的線程數;

要使用以上屬性, 需要創建線程池實現類的子類, 并重寫beforeExecute, afterExecute, terminated方法. 例如: 監控任務的平均執行時間, 最大執行時間, 最小執行時間等.


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 永善县| 阜新市| 宜都市| 保定市| 文安县| 金门县| 宁晋县| 河南省| 太康县| 乌鲁木齐县| 合江县| 太仓市| 东港市| 股票| 台东县| 金昌市| 永城市| 遂川县| 科技| 任丘市| 永德县| 阜阳市| 福安市| 化德县| 石阡县| 墨竹工卡县| 奈曼旗| 绥棱县| 阿拉善盟| 柏乡县| 南宁市| 郓城县| 阜新市| 南澳县| 含山县| 弥渡县| 北流市| 怀集县| 沭阳县| 兴和县| 桑日县|