Android的线程与线程池

原创 2015年11月19日 21:33:02

线程在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:线程工厂,为线程池提供创建新的线程的功能.

版权声明:本文为博主原创文章,未经博主允许不得转载。

java线程、线程池、xml解析入门

  • 2012年08月17日 12:08
  • 2.3MB
  • 下载

Android的线程和线程池

此篇为《Andoroid开发艺术探索》第11章Android的线程和线程池的读书笔记 除了Thread本身以外,在Android中可以扮演线程角色的还有很多,比如AsyncTask和Intent...

【Android学习】线程和线程池

1,分类1)用途①主线程处理UI。②子线程(工作线程)处理耗时操作,如网络请求、IO操作等。 从Android3.0开始,网络访问必须在子线程中进行,否则抛出NetworkOnMainThreadE...

线程并发线程池

  • 2014年08月27日 19:36
  • 13.38MB
  • 下载

源码分析Android中的线程和线程池

概述线程分为主线程和子线程,主线程主要处理和界面相关的事情,而子线程则往往用于执行耗时的操作。在操作系统中,线程是操作系统调度的最小单元。 - AsyncTask封装了线程池和Handler,它主要...

Android——线程和线程池

主要介绍内容: Android 中的线程形态 AsyncTask AsyncTask 的工作原理 HandlerThread IntentService Android 中的线程池 ThreadP...
  • AkaiC
  • AkaiC
  • 2016年10月15日 22:07
  • 345
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android的线程与线程池
举报原因:
原因补充:

(最多只允许输入30个字)