在安卓開發中經常會遇到處理多張,或者分片上傳等需要使用多執行緒的情況,如果簡單的通過new thread建立執行緒,會造成執行緒的頻繁建立和銷毀,占用大量的資源。並且頻繁的呼叫gc機制,這會使效能降低,又非常耗時。
最基本的threadpoolexecutor
1 通過構造方法,建立最基本的執行緒池,這也是引數最多,允許使用者自己設定
threadpoolexecutor threadpoolexecutor=
newthreadpoolexecutor(2
,//核心執行緒數量4,
//該執行緒池內最大執行緒數量
100,
//非核心執行緒保活時間
timeunit.seconds,
//非核心執行緒保活時間單位
newlinkedblockingdeque
(2),
//執行緒佇列(佇列中允許最大執行緒數量)
newthreadpoolexecutor.abortpolicy()
//執行緒數量超過限制時,拒絕策略。預設丟擲異常
);
2 建立執行緒池之後,為了方便檢視當前執行緒的資訊,自定義乙個執行緒
class
mythread
implements
runnable
@override
public
void
run(
)catch
(interruptedexception e)
log.e(
"syw"
,"執行緒:"
+thread.
currentthread()
.getname()
+" 執行:"
+name +
" run");
}}
3 使用執行緒池的方法,執行多個任務
// 2個核心執行緒
// 6-2=4個任務將進入linkedblockingdeque佇列,但是佇列只能排進2個,所以新建立2個執行緒
// 核心執行緒數2+新建立的執行緒2如果超過執行緒池內最大執行緒數,在當前拒絕策略下會丟擲異常
for(
int i =
0; i <
6; i++
)}
4 執行結果
5 結果分析
6 執行順序
首先是核心執行緒1和核心執行緒2立刻執行執行緒0、執行緒1。
然後執行緒2、執行緒3進入佇列,等待核心執行緒執行完成。
新建立的非核心執行緒3和非核心執行緒4立刻執行執行緒4、執行緒5
所以執行的順序是0-1-4-5-2-3(執行緒的執行順序是隨機的0/1可能互換,4/5可能互換,2/3可能互換)
,//核心執行緒數量4,
//該執行緒池內最大執行緒數量
100,
//非核心執行緒保活時間
timeunit.seconds,
//非核心執行緒保活時間單位
newlinkedblockingdeque
(2),
//執行緒佇列(佇列中允許最大執行緒數量)
// new threadpoolexecutor.abortpolicy()//預設策略。執行緒數量超過限制時,拒絕策略,丟擲異常
// new threadpoolexecutor.discardpolicy()//執行緒數量超過限制時,丟掉多餘任務
// new threadpoolexecutor.discardoldestpolicy()//執行緒數量超過限制時,丟掉先進入佇列的任務
// new threadpoolexecutor.callerrunspolicy()//執行緒數量超過限制時,新增任務佇列失敗,主線程執行該任務。然後才會繼續新增任務
);如果執行緒數超過6(最大執行緒數4+佇列最大值2)
安卓 多執行緒
方法1 建立單獨的執行緒 new thread new runnable start 方法2 利用執行緒池 private executorservice executorservice executors.newfixedthreadpool 4 上面是建立乙個固定大小的執行緒池,這裡面的執行緒不...
安卓 多執行緒
第一種實現子執行緒的方法 繼承thread類 private class mythread extends thread new mythread start 第二種實現子執行緒的方式 實現runnable 任務 介面 private class myrunnable implements runn...
理解執行緒池
建立執行緒池的一種方式 threadpoolexecutor threadpoolexecutor new threadpoolexecutor corepoolsize,maximumpoolsize,keepalivetime,unit,workqueue,threadfactory,handl...