一.介绍:
- java 里面线程池的顶级接口是 Executor,但是严格意义上讲 Executor 并不是一个线程池,而 只是一个执行线程的工具。真正的线程池接口是ExecutorService。
- 线程池:虽然线程的创建销毁的开销相对较小,但是频繁得创建和销毁也会消耗有限的资源,从而带来性能上的浪费,也不够高效。因此线程池的出,现就是为了解决这一问题,即在初始状态创建并维护一定数量的空闲线程,当有需要执行的任务,就交付给线程中的一个线程,任务执行结束后,该线程也不会死亡,而是回到线程池中重新变为空闲状态。
- 线程池的好处:减少线程频繁创建销毁的资源开销,同时能够有效控制系统中并发线程的数量,防止系统性能的剧烈下降。
二.常用线程池
- newCachedThreadPool():创建一个具有缓存功能的线程池,系统根据需要创建线程
- newFixedThreadPool(int nThreads):创建一个可重用的,具有固定线程数的线程池
- newSingleThreadExecutor():创建一个单线程线程池
- newScheduledThreadPool(int corePoolSize):创建具有指定线程数的线程池,它将在指定延迟后执行线程任务
- newSingleThreadScheduledExecutor():创建一个延迟执行的单线程线程池
- newWorkingStealingPool(int parallelism):创建持有足够的线程的线程池来支持给定的并行级别,以充分支持多CPU并行能力。
- newWorkingStealingPool():根据CPU个数设置并行级别。
三.源码分析
public interface Executor {
void execute(Runnable command);
}
public interface ExecutorService extends Executor {
/*
* 不再接受新任务
* 当所有已提交任务执行完后,就关闭
* 如果已经关闭,则调用没有其他作用
*/
void shutdown();
/*
* 试图停止所有正在执行的活动任务,暂停处理正在等待的任务
* 并返回等待执行的任务列表
*/
List<Runnable> shutdownNow();
boolean isShutdown();
boolean isTerminated();
//所有任务完成后shutdown,或者超时interrupted后会shutdown
boolean awaitTermination(long timeout, TimeUnit unit)
throws InterruptedException;
// 提交任务
<T> Future<T> submit(Callable<T> task);
<T> Future<T> submit(Runnable task, T result);
Future<?> submit(Runnable task);
// 批量提交任务
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
throws InterruptedException;
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks,
long timeout, TimeUnit unit)
throws InterruptedException;
<T> T invokeAny(Collection<? extends Callable<T>> tasks)
throws InterruptedException, ExecutionException;
<T> T invokeAny(Collection<? extends Callable<T>> tasks,
long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException;
}
3.1.线程池参数
Executor
ExecutorService
AbstractExecutorService
ThreadPoolExecutor
线程池通过Executors类创建出不同线程池,默认四种线程池创建方法都是默认给开发者配置好了相应参数,通过不同参数使用构造方法最终构造出我们看到的不同线程池。
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new