【Java并发专题之十】juc-locks之线程池框架概述

java

环境
  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

回到顶部