Android 线程和线程池

一,Android中的线程形态

  • AsyncTask
 class Asy extends AsyncTask<String,Integer,String>{
        @Override
        protected void onPreExecute() {//异步任务执行前准备工作
            super.onPreExecute();
        }
        @Override
        protected String doInBackground(String... params) {
            //在线程池中执行异步任务
            return null;
        }
     
        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            //更新执行进度
        }
        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
             //执行异步任务结束后,s为返回的结果
        }
    }

AsynTask在具体的使用中的限制
(1)AsynTask的类必须在主线程中加载
(2)AsynTask对象必须在主线程中创建
(3)execute方法必须在UI线程调用
(4)不要在程序中直接调用 onPreExecute(),onPostExecute(),doInBackground,onProgressUpdate();
(5)一个AsynTask对象只能执行一次,即只能调用execute方法。否则报异常

  • HandlerThread
    HandlerThread集成了Thread并且在内部实现了Looper.prepare()和Looper.Loop()l
    可通过quit 或者quitSafely(api18加入的)方法来终止线程
    两者都不会接收新的消息
    区别在于
    quit会清空所有消息,包括延迟消息,非延迟消息
    quitSafely会清空所有延时消息,不会情况分延迟消息 会发送分延迟消息
  • IntentService
    IntentService 是继承于 Service 并处理异步请求的一个类,在 IntentService 内有一个工作线程来处理耗时操作,启动 IntentService 的方式和启动传统 Service 一样,同时,当任务执行完后,IntentService 会自动停止,而不需要我们去手动控制。另外,可以启动 IntentService 多次,而每一个耗时操作会以工作队列的方式在IntentService 的 onHandleIntent 回调方法中执行,并且,每次只会执行一个工作线程,执行完第一个再执行第二个,以此类推。而且,所有请求都在一个单线程中,不会阻塞应用程序的主线程(UI Thread),同一时间只处理一个请求。 那么,用 IntentService 有什么好处呢?首先,我们省去了在 Service 中手动开线程的麻烦,第二,当操作完成时,我们不用手动停止 Service。

IntentService是Service 的子类,默认给我们开启了一个工作线程执行耗时任务,并且执行完任务后自 动停止服务。扩展IntentService比较简单,提供一个构造方法和实现onHandleIntent 方法就可了,不用重写父类的其他方法。但是如果要绑定服务的话,还是要重写onBind 返回一个IBinder 的。使用Service 可以同时执行多个请求,而使用IntentService 只能同时执行一个请求。

  • Android中的线程池
    (1)重用线程池中的线程,避免多次的创建销毁带来的性能开销
    (2)能有效地控制线程的最大的并发数,防止因想线程之间互相抢占资源导致阻塞现象
    (3)能够对线程进行简单的管理,并提供定时执行以及指定间隔循环执行等功能。

Android中线程池主要是通过配置ThreadPoolExecutor来实现的

    public  ThreadPoolExecutor(int corePoolSize, 
                                                  int maximumPoolSize, 
                                                  long keepAliveTime, 
                                                 TimeUnit unit,
                                                 BlockingQueue<Runnable> workQueue, 
                                                ThreadFactory threadFactory)

corePoolSize:
线程池的核心线程数
默认情况下核心线程会一直存活,及时处于闲置状态,但是如果制定了allowCoreThreadTimeOut为true则 会有超时策略 超时后会核心线程就会终止,这个超时时间是由keepAliveTime来设定的
maximumPoolSize
线程池中容纳的最大线程数,如果线程数达到这个值 新的线程进入会被阻塞
keepAliveTime
闲置时的超时时间
unit
设置keepAliveTime的单位
workQueue
线程池中的任务队列,通过线程池的execute方法提交的runnable对象会存储在这个参数中
threadFactory
线程工程,为线程池提供创建新线程的功能,它是一个接口,只有一个方法Thread new Thread(Runnable r)
ThreadPoolExecutor执行任务的大致规则
1.如果线程池中的核心线程数量未达到核心线程的数量,那么会直接启动一个核心线程来执行任务。
2.如果线程池中的线程数量已经达到或者超过核心线程数量,那么任务会被插入到任务队列中排队等待执行
3.如果步骤2中无法将任务插入到任务队列中,这种情况往往是因为任务队列已经满了,这个时候如果线程数量未达到线程池规定的最大值,那么会立刻启动一个非核心线程来执行。
4.如果三步骤线程数量达到线程池规定的最大值,那么就会拒绝这个任务,ThreadPoolExecutor会调用RejectedExecutionHandler的rejectedExecution方法来通知使用者。
线程池的分类
1,fixedThreadPool
它是一种固定线程池数量的线程池,只有核心线程,处于空闲状态,他们并不会被回收,除非线程池关闭。他没有超时机制,也没有任务队列的大小限制。其优势在于可以更加快速的响应外界请求
2.CachedThreadPool
线程池数量不定,只有非核心线程,最大线程数值为Integer.MAX_VALUE,这个值趋于无限大。
有闲置线程就用闲置线程,没有就新建线程,超时时长为60秒。
它相当于一个空集合,任何任务都会立刻执行。
它适合执行大量耗时较少的任务。
3.ScheduledThreadPool
核心线程数量固定,非核心线程数没有限制。
非核心线程限制会立刻回收
主要用于执行定时任务,具有固定周期重复性任务。
4.singleThreadExecutor
只有一个核心线程,确保所有任务在同一个线程中按顺序执行。
不需要处理线程同步问题。

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

推荐阅读更多精彩内容