android 的线程和线程池

线程

基本概念

1、线程分为主线程和子线程,主线程为进程拥有的线程,主线程主要做四大组件的交互和UI的更新,子线程主要做一些耗时的操作。
2、android除了ActivityThread这个线程,其他创建的线程都是子线程
3、线程是操作系统调度的最小单位,有限资源,创建和销毁都会有相应很高的开销,系统通过时间片轮转的方式调度每个线程。

线程种类

1、Thread 传统线程
2、AsyncTask:内部实现为线程池+handler
3、HandlerThread:继承Thread 内部创建了looper 内部有消息循环系统,内部可以创建handler
4、IntentService:IntentService是一个服务,内部采用HandlerThread执行任务,调用onHandleIntent执行耗时的任务,任务执行完毕,服务自动关闭,优点是保证后台任务不易被杀死,保证执行

AsyncTask使用和原理

使用注意点:

1、AsnycTask的对象必须在主线程中创建
2、execute方法必须在主线程调用,并且只能调用一次,否则报运行异常
3、下面四个方法不要在程序中直接调用
(1)onPreExcute 第一个调用的方法,在主线程执行。
(2)doInBackGround 子线程执行 ,执行耗时任务
(3)onProgressUpdate 主线程中执行,更新任务进度
(4)onPostExecute 主线程中执行,获取返回的结果
4、execute()方法内部调用了executeOnExecutor()方法
(1)new AsyncTask().execute 为串行执行任务
(2)new AsyncTask().executeOnExecutor为并行执行任务

原理分析
这里写图片描述

ThreadHandler

1、继承Thread
2、线程内部有looper
3、HandlerThread不用时,通过quit方法和quitsafely方法终止,因为run方法内部调用的looper.loop(),无限循环,所以调用quit和quitsafely方法才能使looper对出循环

IntentService

1、抽象类,所以创建它的子类才能使用
2、内部使用ThreadHandler+handler,handler的创建是使用的子线程的Looper,所以handler在子线程中执行,

 private final class ServiceHandler extends Handler {
        public ServiceHandler(Looper looper) {
            super(looper);
        }

        @Override
        public void handleMessage(Message msg) {
            onHandleIntent((Intent)msg.obj);
            stopSelf(msg.arg1);
        }
    }

onHandleIntent为抽象方法,需要我们自己实现,handleMessage在线程中执行,所以onHandleIntent也是在子线程中执行,执行好使的任务
3、intentService内部采用ThreadHandler,ThreadHanderl内部采用了Looper循环系统执行消息,looper的loop()方法内部是串行执行的,所有onhandleIntent的方法执行也是串行的,任务是排队执行的

线程池

1、android中的线程池使用Executor实现的,它是一个接口,android中线程池实现是ThreadPoolExecutor。
2、创建线程池各参数的含义

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

(1)corePoolSize: 核心线程数,默认一直存活,allowCoreThreadTImeout设置为ture,则闲置的核心线程,超时就会被回收
(2)maxImumPoolSize:线程池最大的活动线程数,活动的线程到达这个数值后,则任务会被堵塞
(3)keepAliveTime:非核心线程闲置时的超时时间,超过这个时间,线程会被回收,如何allowCoreThreadTImeout设置为ture,则也作用于核心线程。
(4)Unit:时间单位 ,枚举类,在keepAliveTime中使用,
(5)workQueue,任务队列,通过execute(Runable runable)添加的线程会存放到这个队列里面。
(6)ThreadFactory:线程工厂,创建新的线程。

3、线程池的优点
(1)重用线程,节省性能开销
(2)有效控制线程最大并发,防止太多线程抢占系统资源造成阻塞
(3)对线程简单管理,可以指定间隔多久执行,或者定时执行任务
4、线程池的添加一个新任务的执行规则
(1) 核心线程未达到核心线程数量,启动一个核心线程
(2) 核心线程数量已经最大,队列未满,则添加到队列,等待,如果队列已满,最大线程数没有到达规定最大值,则启动一个非核心线程启动任务,如果最大线程数到达最大值,则拒绝执行任务。

线程池分类

android提供四种不同类型的线程池,内部间接的都是使用ThreadPoolExecutor实现功能特性
1、FixedThreadPool :线程数量固定,即使闲置也不会被回收,除非关闭线程池
2、CacheThreadPool:线程数量不定,没有核心线程,线程数量任大
3、ScheduleThreadPool: 核心线程固定,非核心线程不固定,非核心线程闲置立即会被回收
4、SingleThreadExecutor:只有一个核心线程,所有任务都会按顺序执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值