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

Android(JAVA)线程池ThreadPoolExecutor

2016-09-07 16:08 260 查看
线程池主要解决了两个问题:当执行大量异步任务的时候,可以提供更好的性能;同时提供了一种管理资源的方法。每一个ThreadPoolExecutor也维护了一些基本的统计,比如已经完成的任务数。

Core和max pool size

ThreadPoolExecutor可以自动的调整pool的大小。当一个新任务被提交的时候,如果有少于corePoolSize的线程在运行,即使有空闲线程存在,也会创建一个新的线程来来处理这个请求。如果有多余corePoolSize但是不足maximumPoolSize的线程在运行,只有在队列满的情况下,才会创建新线程。如果设置coolPoolSize和maximunPoolSize一样大,就创建了一个固定容量线程池。如果把maximumPoolSize设置为一个无边界的值,比如Integer.MAX_VALUE,
将会允许线程池容纳任意数量的并发线程。最典型的,core和max size只在构造时设置,但是也可以通过setCoolPoolSize(int)和setMaximumPoolSize(int)修改。

创建新线程

使用ThreadFactory创建新线程。如果没有特别指定,使用一个defaultThreadFactory(),创建的线程属于同一个ThreadGroup,都拥有NORM_PRIORITY。通过提供一个不同的ThreadFactory,可以修改Thread的名字,thread group,优先级,daemon 状态。如果ThreadFactory从newThread没能成功创建一个线程并且返回null,executor可以继续,但是可能无法继续执行任何的task。

Keep-alive times

如果池中有多于corePoolSize的线程,多余的线程如果空闲超过了keepAlive 时间,将被终止。这提供了一种机制,如果pool没有被活跃使用,可以有效降低资源的消耗。当pool变得活跃之后,新线程可以被创建。这个参数可以通过setKeepAliveTime(long, TimeUnit)来修改。

Queuing

BlockingQueue和线程池的size相互作用:

如果少于corePoolSize的线程在运行,Execuor总是会创建一个新线程,而不是放入队列;

如果运行的线程数大于或等于corePoolSize,Executor将会把请求放入队列,而不是创建一个新线程;

如果请求不能放入队列,并且运行线程数没有达到maximumPoolSize,将会创建一个新的线程;否则,任务将被拒绝。

Reject tasks(拒绝策略)

一共有四种拒绝策略:

1. ThreadPoolExecutor.AbortPolicy(默认),handler将会抛出一个RejectedExecutionException异常。

2. ThreadPoolExecutor.CallerRunsPolicy,线程激活自身的execute去执行任务。

3. ThreadPoolExecutor.DiscardPolicy,不能执行的task将会被简单的丢弃。

4. ThreadPoolExecutor.DiscardOlderPolicy,如果executor没有关闭,工作队列的第一个任务将被丢弃,然后execution将重试(如果失败,将重复这个过程)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息