AsyncTask優缺點(兩種執行緒池)
AsyncTask兩種執行緒池
1.THREAD_POOL_EXECUTOR, 非同步執行緒池
使用 首先建立一個繼承自AsyncTask的MyAsyncTask類,然後呼叫
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
。
當一個任務通過asynct.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,
0)方法欲新增到執行緒池時:- 如果此時執行緒池中的數量小於corePoolSize,即使執行緒池中的執行緒都處於空閒狀態,也要建立新的執行緒來處理被新增的任務。
- 如果此時執行緒池中的數量等於 corePoolSize,但是緩衝佇列 workQueue未滿,那麼任務被放入緩衝佇列。
- 如果此時執行緒池中的數量大於corePoolSize,緩衝佇列workQueue滿,並且執行緒池中的數量小於maximumPoolSize,建新的執行緒來處理被新增的任務。
- 如果此時執行緒池中的數量大於corePoolSize,緩衝佇列workQueue滿,並且執行緒池中的數量等於maximumPoolSize,那麼通過 handler所指定的策略來處理此任務。
- 當執行緒池中的執行緒數量大於 corePoolSize時,如果某執行緒(非核心執行緒)空閒時間超過keepAliveTime,執行緒將被終止。這樣,執行緒池可以動態的調整池中的執行緒數。
2.SERIAL_EXECUTOR,同步執行緒池
使用 它是預設的Executor,所以可以直接呼叫,所以可以有兩種呼叫方法。
1 |
a.
asynct.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, 0 ); |
2 |
b.
asynct.execute( 0 ); |
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兩種執行緒池分析和總結”所述)相關推薦
AsyncTask優缺點(兩種執行緒池)
AsyncTask兩種執行緒池 1.THREAD_POOL_EXECUTOR, 非同步執行緒池 使用 首先建立一個繼承自AsyncTask的MyAsyncTask類,然後呼叫 1 MyAsyncTask asynct = new MyAsyncTask(task); 2
實戰Java高併發程式設計(3.2 執行緒池)
1.Executor jdk提供了一套Executor框架,本質上是一個執行緒池。 newFixedThreadPool()方法:該方法返回一個固定數量的執行緒池。該執行緒池中的執行緒數量始終不變,當有一個新任務提交時,執行緒池中若有空閒執行緒,則立即執行,若沒有,則任務會暫存在一個任
Android通過AsyncTask與ThreadPool(執行緒池)兩種方式非同步載入大量資料的分析與對比
如果您認為本部落格不錯,讀後覺得有收穫,不妨打賞讚助我一下,讓我有動力繼續寫出高質量的部落格。 贈人玫瑰,手有餘香。分享技術,傳遞快樂。 有心課堂,傳遞的不僅僅是技術! QQ交流群:250468947 有心課堂會員,請加入VIP QQ交流
2.3四種執行緒連線池的配置和使用(和自定義執行緒池)
四種執行緒連線池的配置和使用 最終呼叫類和方法 {引數有 核心執行緒數目,最大執行緒數目,存活時間(當前執行緒執行完這個任務之後,等待下一個任務到來的最長等待時間。如果在這個時間內沒有新的任務來到,那當前執行緒就會退出),時間單位,等待佇列(用於存放待執行的任務)} public
執行緒池實現原理(Executor框架),java提供常用的幾種執行緒池、死鎖產生條件和避免
為什麼使用執行緒池 伺服器應用程式中經常出現的情況是:單個任務處理的時間很短而請求的數目卻是巨大的。如果每個請求對應一個執行緒(thread-per-request)方法的不足之一是:為每個請求建立一個新執行緒的開銷很大;為每個請求建立新執行緒的伺服器在建立和銷燬執行緒上
Java定時任務的幾種方法(Thread 和 Timer,執行緒池)
/** * 普通thread * 這是最常見的,建立一個thread,然後讓它在while迴圈裡一直執行著, * 通過sleep方法來達到定時任務的效果。這樣可以快速簡單的實現,程式碼如
]淺談幾種伺服器端模型——多執行緒併發式(執行緒池)
(如果不加以說明,我們都是考慮開發是基於GNU/Linux的)在Linux下建立一個執行緒的方式很簡單,pthread_create() 函式來建立執行緒,其中的一個引數的回撥函式,也就是執行緒本身的執行體函式。 ? 1 void *thread_e
【我的Java筆記】多執行緒_多執行緒實現的第三種方式(執行緒池)
Executors(工廠類) 方法:public static ExecutorService newFixedThreadPool(int nThreads)指定線上程池中多少條執行緒 注:此方法
android的四種執行緒池
四種執行緒池內部構造都是來自同一個方法: public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize,
Java四種執行緒池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingle
轉自:https://www.cnblogs.com/baizhanshi/p/5469948.html 1、new Thread的弊端 執行一個非同步任務你還只是如下new Thread嗎? Java 1 2 3 4 5 6 7
Java 四種執行緒池 - 使用
轉:https://www.cnblogs.com/zhujiabin/p/5404771.html 介紹new Thread的弊端及Java四種執行緒池的使用,對Android同樣適用。本文是基礎篇,後面會分享下執行緒池一些高階功能。 1、new Thread的弊端 執行一個非同步任務你還
Java併發程式設計:4種執行緒池和緩衝佇列BlockingQueue
一. 執行緒池簡介 1. 執行緒池的概念: 執行緒池就是首先建立一些執行緒,它們的集合稱為執行緒池。使用執行緒池可以很好地提高效能,執行緒池在系統啟動時即建立大量空閒的執行緒,程式將一個任務傳給執行緒池,執行緒池就會啟動一
Executors提供的四種執行緒池
Java 5+中的Executor介面定義一個執行執行緒的工具。它的子型別即執行緒池介面是ExecutorService。要配置一個執行緒池是比較複雜的,尤其是對於執行緒池的原理不是很清楚的情況下,因此在工具類Executors面提供了一些靜態工廠方法,生成一些常用的執行緒池,如下所示: -&n
netty的執行緒池-----揭示了使用兩個執行緒池的原因
執行緒模型是Netty的核心設計,設計地很巧妙,之前專案中有一塊處理併發的設計和Netty的Eventloop單執行緒設計類似,效果得到了實證。 Netty5的類層次結構和之前的版本變化很大,網上也有很多文章寫Netty的執行緒模型,Reactor模式,比如這篇http://blog.csd
Python標準模組--concurrent.futures模組(ThreadPoolExecutor:執行緒池,提供非同步呼叫、ProcessPoolExecutor: 程序池,提供非同步呼叫)
目錄 ProcessPoolExecutor: 程序池 ThreadPoolExecutor:執行緒池 map的用法 回撥函式 https://docs.python.org/dev/library/concurrent.futures.html
【小家java】Java中的執行緒池,你真的用對了嗎?(教你用正確的姿勢使用執行緒池)
相關閱讀 【小家java】java5新特性(簡述十大新特性) 重要一躍 【小家java】java6新特性(簡述十大新特性) 雞肋升級 【小家java】java7新特性(簡述八大新特性) 不溫不火 【小家java】java8新特性(簡述十大新特性) 飽受讚譽 【小家java】java9
Hibernate中SessionFactory是執行緒安全的嗎?Session是執行緒安全的嗎(兩個執行緒能夠共享同一個Session嗎)?
Hibernate中SessionFactory是執行緒安全的嗎?Session是執行緒安全的嗎(兩個執行緒能夠共享同一個Session嗎)? SessionFactory對應Hibernate的一個數據儲存的概念,它是執行緒安全的,可以被多個執行緒併發訪問。 Sessio
#一篇文章讓你瞭解四種執行緒池,學習Java不在困惑
在Java開發中,有時遇到多執行緒的開發時,直接使用Thread操作,對程式的效能和維護上都是一個問題,使用Java提供的執行緒池來操作可以很好的解決問題,於是找了下API看到Java提供四種執行緒池使用,Java通過Executors提供四種執行緒池,分別為: 1、newCachedThrea
《Java多執行緒程式設計實戰》—— 第9章 Thread Pool(執行緒池)模式
一個系統中的執行緒相對於其所要處理的任務而言,是一種非常有限的資源。執行緒不僅在執行任務時需要消耗CPU時間和記憶體等資源,執行緒物件(Thread例項)本身以及執行緒所需的呼叫棧(Call Stack)也佔用記憶體,並且Java中建立一個執行緒往往意味著JVM會建立相應的依賴於宿主機作業系
淺析Java中的四種執行緒池
1.使用執行緒池的好處 2.JUC中幾種常用的執行緒池 java.util.concurrent包下的Executors工廠類,提供了一系列的執行緒池的建立方法,其構造方法如下: public ThreadPoolExecutor(int corePoolSize,