【Java并发专题之十】juc-locks之线程池框架概述
环境
jdk version:jdk1.8.0_171
一、Executor接口
执行器接口,也是最顶层的抽象核心接口, 分离了任务和任务的执行。
二、ExecutorService接口
在Executor的基础上提供了执行器生命周期管理,任务异步执行等功能。
在Executor的基础上增强了对任务的控制,同时包括对自身生命周期的管理,主要有四类:
(1)关闭执行器,禁止任务的提交;
(2)监视执行器的状态;
(3)提供对异步任务的支持;
(4)提供对批处理任务的支持。
AbstractExecutorService,ExecutorService的抽象实现,为各类执行器类的实现提供基础。
ThreadPoolExecutor,线程池Executor,也是最常用的Executor,可以以线程池的方式管理线程。
三、ScheduledExecutorService接口
在ExecutorService基础上提供了任务的延迟执行/周期执行的功能。ScheduledThreadPoolExecutor,在ThreadPoolExecutor基础上,增加了对周期任务调度的支持。
四、Executors类
生产具体的执行器的静态工厂,提供了五类可供创建的Executor执行器实例。
1、固定线程数的线程池:在初始化时确定其中的线程总数,运行过程中会始终维持线程数量不变。
/*** 创建一个具有固定线程数的Executor.
*/
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
/**
* 创建一个具有固定线程数的Executor.
* 在需要时使用提供的 ThreadFactory 创建新线程.
*/
public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) {
return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(), threadFactory);
}
ThreadFactory,线程工厂,用于创建单个线程,减少手工创建线程的繁琐工作,同时能够复用工厂的特性。
/*** 默认的线程工厂.
*/
static class DefaultThreadFactory implements ThreadFactory {
private static final AtomicInteger poolNumber = new AtomicInteger(1);
private final ThreadGroup group;
private final AtomicInteger threadNumber = new AtomicInteger(1);
private final String namePrefix;
DefaultThreadFactory() {
SecurityManager s = System.getSecurityManager();
group = (s != null) ? s.getThreadGroup() : Thread.currentThread().getThreadGroup();
namePrefix = "pool-" + poolNumber.getAndIncrement() + "-thread-";
}
public Thread newThread(Runnable r) {
Thread t = new Thread(group, r, namePrefix + threadNumber.getAndIncrement(), 0);
if (t.isDaemon())
t.setDaemon(false);
if (t.getPriority() != Thread.NORM_PRIORITY)
t.setPriority(Thread.NORM_PRIORITY);
return t;
}
}
2、单个线程的线程池
/*** 创建一个使用单个 worker 线程的 Executor.
*/
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
/**
* 创建一个使用单个 worker 线程的 Executor.
* 在需要时使用提供的 ThreadFactory 创建新线程.
*/
public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory) {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(), threadFactory));
}
3、可缓存的线程池:出于资源利用率的考虑,希望在特定的时候对线程进行回收(比如线程超过指定时间没有被使用)。
/*** 创建一个可缓存线程的Execotor.
* 如果线程池中没有线程可用, 则创建一个新线程并添加到池中;
* 如果有线程长时间未被使用(默认60s, 可通过threadFactory配置), 则从缓存中移除.
*/
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
/**
* 创建一个可缓存线程的Execotor.
* 如果线程池中没有线程可用, 则创建一个新线程并添加到池中;
* 如果有线程长时间未被使用(默认60s, 可通过threadFactory配置), 则从缓存中移除.
* 在需要时使用提供的 ThreadFactory 创建新线程.
*/
public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory) {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>(), threadFactory);
}
4、可延时/周期调度的线程池
/*** 创建一个具有固定线程数的 可调度Executor.
* 它可安排任务在指定延迟后或周期性地执行.
*/
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
return new ScheduledThreadPoolExecutor(corePoolSize);
}
/**
* 创建一个具有固定线程数的 可调度Executor.
* 它可安排任务在指定延迟后或周期性地执行.
* 在需要时使用提供的 ThreadFactory 创建新线程.
*/
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory) {
return new ScheduledThreadPoolExecutor(corePoolSize, threadFactory);
}
5、Fork/Join线程池
ForkJoinPool:Fork/Join线程池,在JDK1.7时引入,时实现Fork/Join框架的核心类。
/*** 创建具有指定并行级别的ForkJoin线程池.
*/
public static ExecutorService newWorkStealingPool(int parallelism) {
return new ForkJoinPool(parallelism, ForkJoinPool.defaultForkJoinWorkerThreadFactory, null, true);
}
/**
* 创建并行级别等于CPU核心数的ForkJoin线程池.
*/
public static ExecutorService newWorkStealingPool() {
return new ForkJoinPool(Runtime.getRuntime().availableProcessors(), ForkJoinPool.defaultForkJoinWorkerThreadFactory,
null, true);
}
参考:
executors框架总览
以上是 【Java并发专题之十】juc-locks之线程池框架概述 的全部内容, 来源链接: utcz.com/z/393662.html