02.27 ThreadPoolExecutor創建線程池

方法參數說明:

ThreadPoolExecutor創建線程池


ThreadPoolExecutor創建線程池

拒絕策略: 當線程池的任務緩存隊列已滿並且線程池中的線程數目達到maximumPoolSize時,如果還有任務到來就會採取任務拒絕策略,通常有以下四種策略:

ThreadPoolExecutor.AbortPolicy:丟棄任務並拋出RejectedExecutionException異常。

ThreadPoolExecutor.DiscardPolicy:丟棄任務,但是不拋出異常。

ThreadPoolExecutor.DiscardOldestPolicy:丟棄隊列最前面的任務,然後重新提交被拒絕的任務

ThreadPoolExecutor.CallerRunsPolicy:由調用線程(提交任務的線程)處理該任務

線程池的默認拒絕策略為AbortPolicy,即丟棄任務並拋出RejectedExecutionException異常

使用線程池和不使用線程的區別:差異在於使用線程池的方式是複用線程。 不使用線程池的方式是每次都要創建線程所以消耗的時間差距大,因為執行的工作比較簡單所以大部分時間用來創建線程。

核心線程數的設置:

Nthreads=Ncpu*Ucpu*(1+w/c),其中

Ncpu=CPU核心數

Ucpu=cpu使用率,0~1

W/C=等待時間與計算時間的比率

IO密集型設置核心線程數= 2Ncpu

計算密集型設置核心線程數=Ncpu

計算密集型任務的特點:要進行大量的計算,消耗CPU資源

IO密集型任務特點:涉及到網絡、磁盤IO的任務都是IO密集型任務,這類任務的特點是CPU消耗很少,任務的大部分時間都在等待IO操作完成,IO的速度遠遠低於CPU和內存的速度。對於IO密集型任務,任務越多,CPU效率越高,但也有一個限度。常見的大部分任務都是IO密集型任務,比如Web應用

線程池的工作流程:

當提交一個新任務到線程池時首先線程池判斷基本線程池(corePoolSize)是否已滿?

沒滿,創建一個工作線程來執行任務。

滿了,則進入下個流程;

其次線程池判斷工作隊列(workQueue)是否已滿?

沒滿,則將新提交的任務存儲在工作隊列裡。

滿了,則進入下個流程;最後線程池判斷整個線程池(maximumPoolSize)是否已滿?

沒滿,則創建一個新的工作線程來執行任務,滿了,則交給飽和策略來處理這個任務

如果線程池中的線程數量大於 corePoolSize 時,如果某線程空閒時間超過keepAliveTime,線程將被終止,直至線程池中的線程數目不大於corePoolSize;如果允許為核心池中的線程設置存活時間,那麼核心池中的線程空閒時間超過 keepAliveTime,線程也會被終止


分享到:


相關文章: