关闭

Android的线程与线程池

标签: Thread
174人阅读 评论(0) 收藏 举报

线程在andriod中是一个很重要的概念,从用途上来说主要分为主线程和子线程,其中主线程又称为UI线程,在主线程中是不能操作耗时工作的,由于andriod的特性在UI线程中操作耗时工作会导致ANR(application not Respond)即程序无法响应.除了Thread之外,在andriod中可以扮演线程角色的还有很多,比如AsyncTask和IntentService,同时HanderThread也是一种特殊的线程.

线程的概念

既然讲到了线程,那么到底什么是线程呢?
在操作系统中,线程是操作系统调度的最小单元,同时又是一种受限的系统资源,即线程不可能无限制的产生,并且线程的创建和销毁都会有相应的开销.

什么是线程池

上面我们讲到,线程是什么,而且线程的创建和销毁都是有相应的开销的,当系统中存在大量的线程的时候,系统会通过时间片轮转的方式调度每个线程,因此,线程不可能做到绝对并行,如果在一个进程中频繁的创建和销毁线程,这显然不是高效做法.所以线程池就应用而生了,通过线程缓存的一定数量的线程,就可以避免因为频繁创建和销毁线程带来的系统的开销.

Andriod中线程的形态

AsyncTask
AsyncTask是一种轻量级的异步任务类,它可以在线程池中执行后台任务,然后把执行的进度和结果最终传输到UI线程,从实现上来说,AsyncTask封装了Thread和Handler,通过AsyncTask可以更加方便的执行后台的任务以及访问UI,但是这个并不适合特别耗时的后台任务.
AsyncTask适用的场景:
1. 需要与UI进行交互的
2. 不是特别耗时的
现在让我们认识一下AsyncTask类到底是怎样的:

// params:传入的数据类型 progress:当前的进度值  result:返回的数据
private class MyTask extends AsyncTask<Params,Progress,Result>{
protected void onPreExecute(){
//在主线程执行,用于做准备工作
}
protected Params doInBackground(Params params){
//在线程池中执行,用于后台的耗时操作
}
protected Progress onProgressUpdata(Progress progress){
//在主线程中执行,当后台进程执行的任务进度发生变化的时候此方法被调用
}
protected Reault onPostExecute(Result result){
//在主线程中执行,在异步任务之后,此方法会被调用,其中result是返回值
}
}

最后再罗嗦一下,三个参数一般按情况而定,如果不需要传那些参数的时候,就用Void替代,其中Progress参数一般为Integer.

HanderThread

HandlerThread 继承了Thread,它是一种可以使用Handler的Thread,它的实现也很简单,就是在runde 方法中通过Looper.perpare(),来创建消息队列,并通过Looper.loop()来开启消息循环,这样在实际的使用过程中允许在HanderThread创建Handler了.

IntentService

IntentService是一种特殊的Service,它继承了Service并且他是一个抽象类,因此要想使用它,必须要创建它的子类.IntentService 可以用于执行后台的耗时工作,当任务执行结束之后它会自动停止,同时由于IntentService是服务的原因,这导致他比一般单纯线程的优先级高很多,所以,它比较适合执行一些优先级比较高的任务,因为它不容易被杀死.在底层上,IntentServie封装了HandlerThread和Handler,这一点可以从它的onCreate的方法中看的出来.

Android中的线程池

线程池的优点:
1. 重用线程池中的线程,避免因为线程创建和销毁所带来的性能的开销.
2. 能有效的控制线程的最大并发数,避免大量的线程之间因为抢占系统资源而导致线程的阻塞.
3. 能够有效对线程进行简单的管理,并提供定时执行以及指定间隔循环执行的功能.

ThreadPoolExecutor
ThreadPoolExecutor是线程池的真正的实现,它的构造方法提供了一系列的参数来配置线程池,下面是ThreadPoolExecutor的一个比较常用的构造方法.

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

corePoolSize:线程池中的核心线程数
maxnumPoolSize:线程池中所能容纳的最大的线程数
keepAliveTime:非核心线程闲置时的超时时长,非核心的线程就会被回收
unit:用于指定keepAliveTime参数的时间单位(枚举)
workQueue:线程池中的任务队列,通过线程的execute方法提交的Runnable对象会存储在这个参数中
threadFactory:线程工厂,为线程池提供创建新的线程的功能.

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:8850次
    • 积分:289
    • 等级:
    • 排名:千里之外
    • 原创:22篇
    • 转载:1篇
    • 译文:0篇
    • 评论:2条
    最新评论