AsyncTask兩種執行緒池

2022-09-08 21:12:16 字數 2672 閱讀 3481

asynctask兩種執行緒池

(api 3.0以後):

1.thread_pool_executor, 非同步執行緒池

使用

首先建立乙個繼承自asynctask的myasynctask類,然後呼叫

1

myasynctask asynct =newmyasynctask(task);

2

asynct.executeonexecutor(asynctask.thread_pool_executor,0);

原理

1.corepoolsize=cpu核心數+1;

2.maximumpoolsize=2倍的cpu核心數+1;

3.核心執行緒無超時機制,非核心執行緒在閒置時間的超時時間為1s

4.任務佇列的容量為128

當乙個任務通過asynct.executeonexecutor(asynctask.thread_pool_executor, 0)方法欲新增到執行緒池時:

也就是:處理任務的優先順序為:

核心執行緒corepoolsize、任務佇列workqueue、最大執行緒maximumpoolsize,如果三者都滿了,使用handler處理被拒絕的任務(一般為

丟擲j**a.util.concurrent.rejectedexecutionexception異常

)。2.serial_executor,同步執行緒池

使用

它是預設的executor,所以可以直接呼叫,所以可以有兩種呼叫方法。

1

a.    asynct.executeonexecutor(asynctask.serial_executor,0);

2

b.    asynct.execute(0);

原理serial_executor在thread_pool_executor的基礎上新增了乙個mtasks的集合來保證任務順序執行(非同步)

asynctask在不同sdk版本中的區別

如上述,預設使用非同步

舊版本

通過查閱官方文件發現,asynctask首次引入時,非同步任務是在乙個獨立的執行緒中順序地執行,也就是說一次只能執行乙個任務,不能並行地執行,從1.6開始,asynctask中引入了執行緒池,支援同時執行5個非同步任務,也就是說同時只能有5個執行緒執行,超過的執行緒只能等待,等待前面的執行緒某個執行完了才被排程和執行。換句話說,如果乙個程序中的asynctask例項個數超過5個,那麼假如前5個都執行很長時間的話,那麼第6個只能等待機會了。這是asynctask的乙個限制,而且對於2.3以前的版本無法解決。如果你的應用需要大量的後台執行緒去執行任務,那麼你只能放棄使用asynctask,自己建立執行緒池來管理thread,或者乾脆不用執行緒池直接使用thread也無妨。不得不說,雖然asynctask較thread使用起來比較方便,但是它最多只能同時執行5個執行緒,這也大大侷限了它的實力,你必須要小心的設計你的應用,錯開使用asynctask的時間,盡力做到分時,或者保證數量不會大於5個,否則就可能遇到上面提到的問題。

從1.6開始,asynctask中引入的執行緒池:

1、執行緒池中的工作執行緒少於5個時,將會建立新的工作執行緒執行非同步任務(紅色表示新任務,下同)

2、執行緒池中已經有5個執行緒,緩衝佇列未滿,非同步任務將會放到緩衝佇列中等待

3、執行緒池中已經有5個執行緒,緩衝佇列已滿,那麼執行緒池將新開工作執行緒執行非同步任務

問題:android的裝置一般不超過2個cpu核心,過多的執行緒會造成執行緒間切換頻繁,消耗系統資源。

4、執行緒池中已經有128個執行緒,緩衝佇列已滿,如果此時向執行緒提交任務,將會丟擲rejectedexecutionexception

問題:丟擲的錯誤不catch的話會導致程式fc。

新版本

可能是google意識到了asynctask的侷限性了,從android 3.0開始對asynctask的api做出了一些調整:每次只啟動乙個執行緒執行乙個任務,完成之後再執行第二個任務,也就是相當於只有乙個後台執行緒在執行所提交的任務

(如上 「

android asynctask兩種執行緒池分析和總結

」所述)

來自為知筆記(wiz)

springboot建立執行緒池的兩種方式小結

目錄 這樣的方式建立的好處是當 用到執行緒池的時候才會初始化核心執行緒數 具體 如下 使用方法 public static void main string args 注意 1.不能使用executors的方法建立執行緒池,這個是大量的生產事故得出來的結論 2.maximumpoolsize本程式使...

多執行緒 兩種方式建立執行緒

第一種方式 繼承thread類 public class threaddemo extends thread catch interruptedexception e if s 50 public static void main string args 第二種方式 實現runnable介面 pub...

兩種記憶體池技術(C 實現)

c 相較於其他高階語言來講,能夠方便的進行記憶體管理和操作,是其優勢也是其劣勢,運用得當將使得你編寫的程式效能大大提公升,使用不當也可能給你帶來無盡的麻煩。記憶體池就是其中的重要技術手段之一,下面重點看看常見的兩種記憶體池技術。此種記憶體池使用廣泛,實現相對簡單,基本能夠滿足大部分時候的需求,使用模...