Android的线程和线程池

本文是《Android开发艺术探索》的学习笔记

Android中的线程形态

1.AsyncTask

AsyncTask封装了Thread和Handler,是抽象的泛型类,提供了Params,Progress,Result这三个泛型参数

四个核心方法:

  • 1.onPreExecute() 主线程中执行,异步任务之前调用
  • 2.doInBackground(Params... par) 异步后台执行
  • 3.onProgressUpdate(Progress... value) 主线程中执行,进度发生变化该方法被调用
  • 4.onPostExecute(Result res) 主线程中执行,异步任务执行完改方法被调用

使用过程中有以下条件限制

  • 1.AsyncTask的类必须在主线程中加载。在5.0的源码中ActivityThread的main方法中调用AsyncTask的init方法
  • 2.AsyncTask的对象必须在主线程中创建
  • 3.execute方法必须在UI线程调用
  • 4.不要在程序中直接调用上述四个核心方法
  • 5.一个AsyncTask对象只能执行一次,即只能调用一次execute方法,否则报运行时异常
  • 6.版本差异
    • 1.在Android1.6之前是串行执行任务;
    • 2.Android1.6的时候采取并行处理;
    • 3.Android3.0又采取串行执行,尽管如此3.0以后的版本还可以通过AsyncTask的executeOnExecutor来并行执行任务

2.HandlerThread

HandlerThread继承了Thread. 该线程运行的时候创建Looper。可以说是自带Looper的Thread

3.IntentService

IntentService抽象类,继承了Service. 内部包含了ServiceHandler和HandlerThread.

IntentService流程1
IntentService流程2
IntentService流程2
public class LocalIntentService extends IntentService {
private static final String TAG = "LocalIntentService";

public LocalIntentService() {
    super(TAG);
}

@Override
protected void onHandleIntent(final Intent intent) {
    final String action = intent.getStringExtra("task_action");
    Log.d(TAG, "receive task :" +  action);

    SystemClock.sleep(3000);
    if ("com.ryg.action.TASK1".equals(action)) {
        Log.d(TAG, "handle task: " + action);
    }
}

@Override
public void onDestroy() {
    Log.d(TAG, "service destroyed.");
    super.onDestroy();
}
}

启动服务

 Intent service = new Intent(this, LocalIntentService.class);
service.putExtra("task_action", "com.ryg.action.TASK1");
startService(service);
service.putExtra("task_action", "com.ryg.action.TASK2");
startService(service);
service.putExtra("task_action", "com.ryg.action.TASK3");
startService(service);

Android中的线程池

线程池的优点:

  • 1.重用线程,避免开销
  • 2.有效控制线程并发数,避免因抢占资源造成的阻塞
  • 3.有效管理,提供定时及循环间隔执行等功能

ThreadPoolExecutor

参数:

  • 1.corePoolSize: 核心线程数。默认情况下核心线程在线程池中会一直存活,即便是闲置状态。如果将ThreadPoolExecutor的allowCoreThreadTimeOut设置为true,那么闲置的核心线程在等待新任务到来时会有超时策略
  • 2.maximumPoolSize:容纳的最大线程数
  • 3.keepAliveTime:非核心线程闲置时的超时时长,超过这个时长,非核心线程就会被回收。
  • 4.TimeUnit
  • 5.workQueue
  • 6.ThreadFactory

线程池的分类

  • 1.FixedThreadPool: newFixedThreadPool方法创建。是一种数量固定的线程池,只有核心线程,且核心线程不会被回收,可以快速相应外界请求。没有超时机制,没有队列大小限制。
  • 2.CachedThreadPool:newCachedThreadPool方法创建。是一种线程数量不定的线程池,只有非核心线程。有超时机制。适合执行大量的耗时较少的任务
  • 3.ScheduledThreadPool:核心线程数量是固定的,非核心线程数是没有固定的,当非核心线程闲置时会被立即回收。主要用于执行定时任务和具有固定周期的重复任务。
  • 4.SingleThreadExecutor:线程池内部只有一个核心线程,确保所有的任务都在同一个线程中按顺序执行。
    private void runThreadPool() {
        Runnable command = new Runnable() {
        @Override
        public void run() {
            SystemClock.sleep(2000);
        }
        };

        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(4);
        fixedThreadPool.execute(command);
    
        ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
        cachedThreadPool.execute(command);
    
        ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(4);
        // 2000ms后执行command
        scheduledThreadPool.schedule(command, 2000, TimeUnit.MILLISECONDS);
        // 延迟10ms后,每隔1000ms执行一次command
        scheduledThreadPool.scheduleAtFixedRate(command, 10, 1000, TimeUnit.MILLISECONDS);

        ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
        singleThreadExecutor.execute(command);
    }

参考:
《Android开发艺术探索》

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容