1. 程式人生 > >AsyncTask優缺點(兩種執行緒池)

AsyncTask優缺點(兩種執行緒池)

AsyncTask兩種執行緒池
1.THREAD_POOL_EXECUTOR, 非同步執行緒池
使用 首先建立一個繼承自AsyncTask的MyAsyncTask類,然後呼叫
1 MyAsyncTask asynct = new MyAsyncTask(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,即使執行緒池中的執行緒都處於空閒狀態,也要建立新的執行緒來處理被新增的任務。
  • 如果此時執行緒池中的數量等於 corePoolSize,但是緩衝佇列 workQueue未滿,那麼任務被放入緩衝佇列。
  • 如果此時執行緒池中的數量大於corePoolSize,緩衝佇列workQueue滿,並且執行緒池中的數量小於maximumPoolSize,建新的執行緒來處理被新增的任務。
  • 如果此時執行緒池中的數量大於corePoolSize,緩衝佇列workQueue滿,並且執行緒池中的數量等於maximumPoolSize,那麼通過 handler所指定的策略來處理此任務。
  • 當執行緒池中的執行緒數量大於 corePoolSize時,如果某執行緒(非核心執行緒)空閒時間超過keepAliveTime,執行緒將被終止。這樣,執行緒池可以動態的調整池中的執行緒數。
也就是:處理任務的優先順序為: 核心執行緒corePoolSize、任務佇列workQueue、最大執行緒maximumPoolSize,如果三者都滿了,使用handler處理被拒絕的任務(一般為丟擲java.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兩種執行緒池分析和總結”所述

相關推薦

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,