成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

分析Android中線程和線程池

瀏覽:2日期:2022-09-18 11:21:54
目錄前言HandlerThreadIntentService線程池的好處ThreadPoolExecutor線程池的分類FixedThreadPoolCachedThreadPoolScheduledThreadPoolSingleThreadExecutor前言

由于內容過多,所以將分為上下兩部分,第一部分主要和大家談談Android中的線程,以及在Android中的常用的線程池。第二部分我們一起來了解一下AsyncTask的使用和工作原理。

HandlerThread

HandlerThread是Thread的子類,它是一種可以使用Handler的Thread,它的實現比較簡單。我們來看看它的源碼:

package android.os;public class HandlerThread extends Thread { int mPriority; int mTid = -1; Looper mLooper; public HandlerThread(String name) {super(name);mPriority = Process.THREAD_PRIORITY_DEFAULT; } public HandlerThread(String name, int priority) {super(name);mPriority = priority; } protected void onLooperPrepared() { } @Override public void run() {mTid = Process.myTid();Looper.prepare();synchronized (this) { mLooper = Looper.myLooper(); notifyAll();}Process.setThreadPriority(mPriority);onLooperPrepared();Looper.loop();mTid = -1; } public Looper getLooper() {if (!isAlive()) { return null;}// If the thread has been started, wait until the looper has been created.synchronized (this) { while (isAlive() && mLooper == null) {try { wait();} catch (InterruptedException e) {} }}return mLooper; } public boolean quit() {Looper looper = getLooper();if (looper != null) { looper.quit(); return true;}return false; } public boolean quitSafely() {Looper looper = getLooper();if (looper != null) { looper.quitSafely(); return true;}return false; } public int getThreadId() {return mTid; }}

為了讓大家看清楚,我們源碼的一些英文注釋干掉了,現在就很清晰了。整個類中,除了構造方法和對外提供幾個public方法以外,就剩一個方法了run()。從它的實現來看,和普通的Thread實現沒有什么區別。都是在run()方法中執行耗時操作。不過,HandlerThread內部創建了消息隊列,并且run()方法是一個無限循環的方法,當我們不需要HandlerThread的時候,我們可以調用quitSafely()或者quit()方法來結束這個線程。這是比較方便的。

IntentService

IntentService是一種特殊的Service,它是Service的子類,并且它是一個抽象類,所以必須創建它的子類才可以使用Intent Service。Intent Service可用于執行后臺的耗時任務,當任務執行完畢,它會自己結束,不需要開發著手動結束它。這里需要注意一個問題,Intentservice內置有線程,但是它還是屬于Service,所以它的優先級會比線程高很多,所以不容易被系統殺死。所以比較合適去執行一些優先級比較高的任務。看看它的源碼:

package android.app;import android.annotation.WorkerThread;import android.annotation.Nullable;import android.content.Intent;import android.os.Handler;import android.os.HandlerThread;import android.os.IBinder;import android.os.Looper;import android.os.Message;public abstract class IntentService extends Service { private volatile Looper mServiceLooper; private volatile ServiceHandler mServiceHandler; private String mName; private boolean mRedelivery; private final class ServiceHandler extends Handler {public ServiceHandler(Looper looper) { super(looper);}@Overridepublic void handleMessage(Message msg) { onHandleIntent((Intent)msg.obj); stopSelf(msg.arg1);} } public IntentService(String name) {super();mName = name; } public void setIntentRedelivery(boolean enabled) {mRedelivery = enabled; } @Override public void onCreate() {// TODO: It would be nice to have an option to hold a partial wakelock// during processing, and to have a static startService(Context, Intent)// method that would launch the service & hand off a wakelock.super.onCreate();HandlerThread thread = new HandlerThread('IntentService[' + mName + ']');thread.start();mServiceLooper = thread.getLooper();mServiceHandler = new ServiceHandler(mServiceLooper); } @Override public void onStart(@Nullable Intent intent, int startId) {Message msg = mServiceHandler.obtainMessage();msg.arg1 = startId;msg.obj = intent;mServiceHandler.sendMessage(msg); } @Override public int onStartCommand(@Nullable Intent intent, int flags, int startId) {onStart(intent, startId);return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY; } @Override public void onDestroy() {mServiceLooper.quit(); } public IBinder onBind(Intent intent) {return null; } @WorkerThread protected abstract void onHandleIntent(@Nullable Intent intent);}

這里就很簡單了,這些方法對于經常使用Service的朋友來說,就很熟悉了。大家看onCreate()方法。沒錯IntentService就是封裝了HandlerThread和Handler。

當我們啟動IntentService是onCreate(),方法將會被調用,然后就會創建HandlerThread和ServiceHandler。而onStartCommand()方法又調用了onStart()方法,從onStart()方法可以看出IntentService 僅僅是通過ServiceHandler來發一個消息,這個消息會在HandlerThread中被處理掉。

大家看這個onStart()方法,將intent作為消息傳遞給onHandleIntent,這個intent通常是我們傳遞進來的數據。而onHandleIntent就是通過這個intent來區別具體的后臺任務的。

好了,AsyncTask的使用和工作原理。我們會在下一章在說。下面我們看看線程池吧。

不知道大家有沒有遇到過這種情況。我們在寫項目,遇到耗時操作的時候,怎么辦呢,是不是new Thread().start,那這樣的話,整個項目中得new多少個Thread。這種明顯是很浪費性能。畢竟線程也是好資源的嘛。那么有沒有一種可以方法對線程進行復用呢?答案就是線程池。

線程池的好處

1、重用線程池中的線程,避免因為線程的創建和銷毀帶來的性能開銷。

2、能有效的控制線程池中的線程并發數,避免大量線程之間因為互相搶占資源而導致的阻塞現象。

3、能夠對線程進行簡單的管理,并提供定時執行以及指定間隔循環執行等功能。

ThreadPoolExecutor

Android中的線程池概念是來源于java中Executor,Executor是一個空的接口,真正的線程池實現ThreadPoolExecutor。

public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory) {this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, defaultHandler); }

簡單介紹一下ThreadPoolExcutor各個參數的含義

corePoolSize:線程池的核心線程數,默認情況下,核心線程會在線程池中一直存活,即使他們處于閑置狀態。當我們把ThreadPoolExecutor中的allowCoreThreadTimeOut屬性設置為true,那么閑置的核心線程在等待新任務的時候,如果時間超過keepAliveTime所設置的時間,核心線程將會被回收。

maximumPoolSize:設置最大線程池能夠容納的最大線程數,當線程池中的線程達到這個數以后,新任務將會被阻塞。

keepAliveTime:非核心線程數閑置的時間。

unit:指定keepAliveTime參數的時間單位。

workQueue:線程池中的任務隊列。

threadFactory:線程工廠,為線程池提供創建新線程的功能。

線程池的分類

Android中常見的線程池有四種,FixedThreadPool、CachedThreadPool、ScheduledThreadPool、SingleThreadExecutor。

FixedThreadPool

FixedThreadPool線程池是通過Executors的new FixedThreadPool方法來創建。它的特點是該線程池中的線程數量是固定的。即使線程處于閑置的狀態,它們也不會被回收,除非線程池被關閉。當所有的線程都處于活躍狀態的時候,新任務就處于隊列中等待線程來處理。注意,FixedThreadPool只有核心線程,沒有非核心線程。

public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(), threadFactory);}CachedThreadPool

CachedThreadPool線程池是通過Executors的newCachedThreadPool進行創建的。它是一種線程數目不固定的線程池,它沒有核心線程,只有非核心線程,當線程池中的線程都處于活躍狀態,就會創建新的線程來處理新的任務。否則就會利用閑置的線程來處理新的任務。線程池中的線程都有超時機制,這個超時機制時長是60s,超過這個時間,閑置的線程就會被回收。這種線程池適合處理大量并且耗時較少的任務。這里得說一下,CachedThreadPool的任務隊列,基本都是空的。

public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE,60L, TimeUnit.SECONDS,new SynchronousQueue<Runnable>());}ScheduledThreadPool

ScheduledThreadPool線程池是通過Executors的newScheduledThreadPool進行創建的,它的核心線程是固定的,但是非核心線程數是不固定的,并且當非核心線程一處于空閑狀態,就立即被回收。這種線程適合執行定時任務和具有固定周期的重復任務。

public static ScheduledExecutorService newScheduledThreadPool( int corePoolSize, ThreadFactory threadFactory) {return new ScheduledThreadPoolExecutor(corePoolSize, threadFactory); }public ScheduledThreadPoolExecutor(int corePoolSize, ThreadFactory threadFactory) {super(corePoolSize, Integer.MAX_VALUE, DEFAULT_KEEPALIVE_MILLIS, MILLISECONDS, new DelayedWorkQueue(), threadFactory); }SingleThreadExecutor

SingleThreadExecutor線程池是通過Executors的newSingleThreadExecutor方法來創建的,這類線程池中只有一個核心線程,也沒有非核心線程,這就確保了所有任務能夠在同一個線程并且按照順序來執行,這樣就不需要考慮線程同步的問題。

public static ExecutorService newSingleThreadExecutor() {return new FinalizableDelegatedExecutorService (new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>())); }

以上就是分析Android中線程和線程池的詳細內容,更多關于Android中線程和線程池的資料請關注好吧啦網其它相關文章!

標簽: Android
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
91国内精品野花午夜精品 | 国产精品乱码| 色偷偷久久人人79超碰人人澡 | 91婷婷韩国欧美一区二区| 亚洲欧美综合国产精品一区| 亚洲永久免费| 欧美一区中文字幕| 亚洲成av人片在线观看| 黄色在线一区| 91麻豆精品国产91久久久久久| 亚洲免费伊人电影| 国产福利不卡视频| 制服丝袜国产精品| 亚洲最大的成人av| av在线播放成人| 色8久久精品久久久久久蜜| 亚瑟在线精品视频| 欧美日韩精品免费观看| 欧美日韩成人在线一区| 国产精品嫩草99a| 精品一区二区三区av| 欧美美女一区二区| 亚洲女同女同女同女同女同69| 国产精品小仙女| 国产伦精品一区二区三区视频孕妇 | 性感美女久久精品| 欧美91大片| 欧美日韩精品一区二区在线播放 | 一二三区精品视频| 亚洲国产国产亚洲一二三| 欧美另类变人与禽xxxxx| 艳妇臀荡乳欲伦亚洲一区| 99久久国产综合精品色伊| 欧美日韩免费观看一区二区三区 | 欧美久久影院| 欧美一级夜夜爽| 亚洲午夜电影网| 欧美日韩理论| 久久综合狠狠综合久久综合88 | 国产.欧美.日韩| 日韩欧美一二三四区| 99久久国产免费看| 国产精品家庭影院| 国产精品乱看| 久久精品国产成人一区二区三区 | 9色porny自拍视频一区二区| 久久精子c满五个校花| 午夜国产精品视频| 亚洲另类中文字| 免费一区视频| 蜜桃久久久久久| 91精品国产福利在线观看 | 色女孩综合影院| 国产呦精品一区二区三区网站| 欧美大片在线观看| 欧美日韩1080p| 亚洲综合自拍偷拍| 色中色一区二区| 激情文学综合网| 日韩欧美在线一区二区三区| 成人97人人超碰人人99| 国产蜜臀av在线一区二区三区| 亚洲深夜激情| 久久精品99国产国产精| 欧美va亚洲va国产综合| 91麻豆高清视频| 亚洲欧美日韩一区二区 | 久久高清免费观看| 日本在线播放一区二区三区| 色国产综合视频| 成人黄色网址在线观看| 日韩午夜中文字幕| 久久不见久久见免费视频1| 99精品热6080yy久久| 欧美一二三区精品| 国产盗摄精品一区二区三区在线| 日韩手机在线导航| 91小视频免费看| 欧美大片拔萝卜| 91免费看视频| 亚洲第一激情av| 日韩一区二区三区在线观看| 亚洲日本一区二区三区| 老牛影视一区二区三区| 久久久精品免费免费| 亚洲一区在线免费| 国产精品日韩成人| 一本到不卡精品视频在线观看| 国产精品午夜在线| 久久久久在线| 亚洲欧美激情小说另类| 日本高清无吗v一区| 一区二区三区中文字幕精品精品| 午夜电影网一区| 日韩精品一区二区三区中文不卡 | 9色精品在线| 麻豆成人91精品二区三区| 精品1区2区| 在线电影院国产精品| 国产乱码精品一区二区三区av| 亚洲激情专区| 国内精品视频666| 色美美综合视频| 欧美日本中文| 久久夜色精品一区| 色婷婷久久综合| 亚洲视频一二三| 日韩一级片网站| 毛片基地黄久久久久久天堂| 欧美mv和日韩mv的网站| 久久成人久久鬼色| 亚洲美女视频一区| 欧美伊人久久久久久久久影院| 国产精品你懂的| 8x8x8国产精品| 日本三级亚洲精品| 国产精品免费久久| 亚洲免费毛片网站| 欧美一区二区在线看| 视频一区二区三区入口| 欧美成人激情免费网| 日韩精品一二三四| 国产精品成人网| 91麻豆精品国产自产在线观看一区 | 国产偷国产偷亚洲高清人白洁| 国产精品一品视频| 亚洲国产精品一区二区久久恐怖片| 成人亚洲一区二区一| 成人欧美一区二区三区黑人麻豆 | 高清国产一区二区三区| 欧美久久一区二区| 国产日韩欧美一区二区三区四区| 中文字幕一区不卡| 日韩一级黄色片| 国产精品主播直播| 婷婷国产在线综合| 亚洲区一区二| 成人教育av在线| 欧美变态tickling挠脚心| 色狠狠桃花综合| 麻豆精品一区二区| 亚洲男人的天堂在线aⅴ视频| 欧美激情一级片一区二区| 国产精品资源网站| 日韩精品一区二区三区在线| 欧美亚洲丝袜传媒另类| 美女国产一区二区三区| 亚洲成人自拍偷拍| 久久在线视频| 亚洲欧洲精品一区| 亚洲激情图片qvod| 欧美成人vr18sexvr| 成人app软件下载大全免费| 国产乱码精品| 久久av中文字幕片| 精品视频色一区| 极品少妇xxxx精品少妇偷拍 | 欧美一二三在线| 成人一区二区三区| 亚洲精品一区二区精华| 欧美高清一级片在线| 成人av动漫网站| 国产福利视频一区二区三区| 精品美女在线观看| 亚洲一区精品视频| 五月综合激情网| 国产精品成人午夜| 噜噜爱69成人精品| 国产精品自在在线| 最新日韩在线视频| 国产一区久久| 国产精品vip| 精品视频在线看| 色欧美88888久久久久久影院| 尤物av一区二区| 中文字幕视频一区| 99视频一区| 18成人免费观看视频| 亚洲综合激情小说| 一区二区三区四区在线| 男人的天堂亚洲在线| 亚洲影院免费| 国产精品主播直播| 国产高清久久久久| 国产人久久人人人人爽| 久久精品欧美一区二区三区不卡| 亚洲高清网站| 欧美激情一级片一区二区| 亚洲影视在线播放| 国产精品视频线看| 久久精品日产第一区二区| 日韩视频在线播放| 老司机午夜精品| 国产精品的网站| 欧洲在线/亚洲| www精品美女久久久tv| 国产校园另类小说区| 国产女人18水真多18精品一级做 | 91成人免费网站| 色婷婷综合在线|