class ThreadPoolExecutor 异步
extends AbtractExecutorService spa
能提高大量异步任务的执行效率,提供了线程等资源的管理,而且维护了一些基本的统计信息。 线程
两个重要的参数:corePoolSize和maximumPoolSize。当一个任务被提交时,若是正在运行的线程数少于corePoolSize,无论线程是否空闲,则建立新的线程处理该任务请求;若是线程数大于corePoolSize,且小于maximumPoolSize,只有在任务队列已满时才建立新的线程。设置corePoolSize==maximumPoolSize,能够建立一个固定大小的线程池;也能够设置maximumPoolSize为Integer.MAX_VALUE。 rest
默认只有新任务来的时候才会建立和启动线程,也能够经过重写方法prestartCoreThread或prestartAllCoreThreads,能够用一个非空的队列来在线程池建立的时候预启动线程。 队列
线程的建立默认是经过defaultThreadFactory,被建立的线程有相同的优先级(NORM_PRIORITY),线程工厂指定的线程名,相同的线程组,非守护线程等。用户能够实现本身的ThreadFactory来指定上述属性。线程必须有“modifyThread”运行时权限,若是没有该权限,一些服务将没法使用,如运行时的配置改变没法生效,线程池关闭不必定成功等。 资源
若是线程池当前的线程数大于corePoolSize,多余的线程在空闲时间超过keepAliveTime后会被终止;若是设置allowCoreThreadTimeOut(true),则该限制也一样应用于core threads。 get
使用BlockingQueue来存听任务队列。当新任务来时: it
1. 若是小于corePoolSize的线程数执行,则建立新线程; io
2. 若是大于等于corePoolSize的线程数执行,则新任务添加到队列中; class
3. 若是任务请求没法添加到队列中,建立新线程,当超过maximumPoolSize时任务会被拒绝。
一般有三种任务队列策略:
1. SynchronousQueue:不保存任务,直接将任务提交线程处理。能够避免一组相互依赖的请求内部可能出现的锁。一般要求设置maximumPoolSize为最大;
2. LinkedBlockingQueue:队列无最大上限。建立的线程数不会超过corePoolSize,maximumPoolSize在这种状况下不起做用。适合相互独立的线程,能够用来缓冲突发的大量请求;
3. ArrayBlockingQueue:使用有限的maximumPoolSize,避免资源的耗尽;但协调和控制的难度增大,须要在队列大小和线程池大小之间作平衡。使用大的队列和小的线程池,能够最小化cpu使用和系统资源,以及上下文切换消耗,但致使低吞吐量。若是任务频繁的阻塞(如I/O),系统能够分配比用户容许的更多的线程时间。使用小的队列一般要求大的线程池,能够保持CPU忙碌,但可能带来更大的调度开销,以至于较低吞吐量。
当线程池已经关闭,或者使用了有限的maximumPoolSize和队列而且已饱和,则新的任务将会被拒绝。这时将调用rejectedExecution。有四种预约义的线程拒绝策略:
1. ThreadPoolExecutor.AbortPolicy,抛出RejectedExecutionException;
2. ThreadPoolExecutor.CallerRunsPolicy,(the thread that invokes execute itself runs the task)提供了一种简单的反馈控制机制来下降任务提交的频率;
3. ThreadPoolExecutor.DiscardPolicy,任务被抛弃;
4. ThreadPoolExecutor.DiscardOldestPolicy,队列顶端的任务被抛弃,而且重试任务执行;
除了预约义,也能够定义和使用其它类型的RejectedExecutionHandler。
同时提供了可被重写的方法beforeExecute和afterExecute,用于控制运行环境。此外terminated能够被重写,用于线程池中止时须要处理的过程。若是hook或回调方法执行过程当中抛出异常,则内部的worker线程可能运行失败而且意外终止。
abstract class AbstractExecutorService
implements ExecutorService
ExecutorService的默认实现。
经过newTaskFor实现了submit,invokeAll,invokeAny;
interface ExecutorService
implements Executor
shutdown容许以前提交的任务在停止以前执行完成,再也不接受新任务,但不等待任务执行完成;
shutdownNow而且尝试中止当前执行的任务,阻止等待的任务执行,返回等待执行的任务列表,不保证必定可以关闭执行中的任务(例如调用interrupt中断线程有可能失败);
isShutdown:
isTerminated: 调用shutdown/shutdownNow以后,若是全部任务都完成了则返回true。
awaitTermination(timeout,unit): 在shutdown请求后,阻塞到全部任务都执行完成或者超时,或者当前线程被中断。若是是超时,返回false,若是该executor停止返回true;
<T> Future<T> submit(Callable<T> task): Future模式,提交后返回一个Future,经过调用Future的get方法获取实际任务成功执行的返回值;
<T> Future<T> submit(Runnable task, T result):
Future<?> submit(Runnable task);
invokeAll(tasks): 执行给定的一组任务,返回Future;
interface Executor
将任务提交与任务执行的机制解耦。不显式的建立线程,而是用例如executor.execute(new RunnableTask1());的形式。
不严格要求异步执行,能够直接在调用者线程中执行:
class DirectExecutor implements Executor {
public void execute(Runnable r) {
r.run();
}
}
但一般是为每一个任务开启一个新的线程。
class ThreadPerTaskExecutor implements Executor {
public void execute(Runnable r) {
new Thread(r).start();
}
}
Executor只有一个execute(Runnable command);方法,要求若是任务不能被接受执行,则抛出RejectedExecutionException,若是command为null,抛出NullPointerException异常。