AsyncTask兩種線程池
1.THREAD_POOL_EXECUTOR, 異步線程池
1 |
MyAsyncTask
asynct = new
MyAsyncTask(task); |
2 |
asynct.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,
0 ); |
corePoolSize
=CPU核心數+1;2.
maximumPoolSize
=2倍的CPU核心數+1;3.核心線程無超時機制,非核心線程在閒置時間的超時時間爲
1s
;4.任務隊列的容量爲
128
。- 如果此時線程池中的數量小於corePoolSize,即使線程池中的線程都處於空閒狀態,也要創建新的線程來處理被添加的任務。
- 如果此時線程池中的數量等於 corePoolSize,但是緩衝隊列 workQueue未滿,那麼任務被放入緩衝隊列。
- 如果此時線程池中的數量大於corePoolSize,緩衝隊列workQueue滿,並且線程池中的數量小於maximumPoolSize,建新的線程來處理被添加的任務。
- 如果此時線程池中的數量大於corePoolSize,緩衝隊列workQueue滿,並且線程池中的數量等於maximumPoolSize,那麼通過 handler所指定的策略來處理此任務。
- 當線程池中的線程數量大於 corePoolSize時,如果某線程(非核心線程)空閒時間超過keepAliveTime,線程將被終止。這樣,線程池可以動態的調整池中的線程數。
2.SERIAL_EXECUTOR,同步線程池
1 |
a.
asynct.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, 0 ); |
2 |
b.
asynct.execute( 0 ); |
AsyncTask在不同SDK版本中的區別
1、線程池中的工作線程少於5個時,將會創建新的工作線程執行異步任務(紅色表示新任務,下同)
2、線程池中已經有5個線程,緩衝隊列未滿,異步任務將會放到緩衝隊列中等待
3、線程池中已經有5個線程,緩衝隊列已滿,那麼線程池將新開工作線程執行異步任務
問題:Android的設備一般不超過2個cpu核心,過多的線程會造成線程間切換頻繁,消耗系統資源。
4、線程池中已經有128個線程,緩衝隊列已滿,如果此時向線程提交任務,將會拋出RejectedExecutionException
問題:拋出的錯誤不catch的話會導致程序FC。