Android开发经验谈:并发编程(线程与线程池)(推荐)开发经验谈:并发编程(线程与线程池)(推荐)
一、线程一、线程
在Android开发中,你不可能都在主线程中开发,毕竟要联网,下载数据,保存数据等操作,当然这就离不开线程。
(当然你可以在Android4.0以前的手机里在主线程请求网络,我最早开发的时候,用的手机比较古老。。。)
在Android中你可以随意创建线程,于是就会造成线程不可控,内存泄漏,创建线程消耗资源,线程太多了消耗资源等问题。
具体线程怎么创建我就不在文章里描述了,毕竟这主要将并发编程。。。。
大家知道线程不可控就好了。。。于是就需要对线程进行控制,防止一系列问题出现,这就用到了如下要讲的东西。
二、线程池二、线程池
线程池:顾名思义,就是放线程的大池子。
如何创建一个线程池?
先说说几个系统的线程池:
FixedThreadPool 创建定长线程的线程池
CachedThreadPool 需要的时候建立新的线程,超时线程销毁
SingleThreadPool 单个线程的线程池
ScheduledThreadPool 可以定时的线程池,创建周期性的任务
这几个线程池不做多余阐述,因为这些线程池的原理都与我下面要讲的有关。。。。
如何自定义线程池(先来了解几个必须知道的参数):
corePoolSize::
核心线程池大小,线程池中主要工作的线程的多少。
maximumPoolSize::
线程池最大线程数。
keepAliveTime::
空闲线程可保持的时间是多久,如果你启用了allowCoreThreadTimeOut方法,你的线程池里的空闲线程在这个时间段后会自
动销毁,如果没启用,则只要不超过corePoolSize,空闲线程也不会销毁。
Unit::
keepAliveTime的时间单位
workQueue::
阻塞队列,当任务达到corePoolSize,就会被放入这个队列
常见几种BlockingQueue实现
ArrayBlockingQueue : 有界的数组队列
LinkedBlockingQueue : 可支持有界/无界的队列,使用链表实现
PriorityBlockingQueue : 优先队列,可以针对任务排序
SynchronousQueue : 队列长度为1的队列,和Array有点区别就是:client thread提交到block queue会是一个阻塞过程,直到
有一个worker thread连接上来poll task。
threadFactory::
线程工厂,主要用来创建线程;
handler::
表示当拒绝处理任务时的策略,也就是参数maximumPoolSize达到后丢弃处理的方法。有以下四种取值:
ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。
ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。
ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务