您的位置:首页 > 移动开发 > Android开发

Android的线程与线程池

2015-11-19 21:33 423 查看
线程在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:线程工厂,为线程池提供创建新的线程的功能.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Thread