Executors源码解读——创建ExecutorService线程池

〇、[源码版本] jdk 1.8

一、线程池概述

1)线程的创建需要操作线程资源、栈空间等,大量且频繁的创建与销毁需要消耗大量时间。

2)使用线程池处理,就可以复用一组线程,把一小组任务交给线程池分发处理。

3)线程池内维护了若干数量的线程:
a.没有任务时候,这些线程处于等待状态
b.有新任务,就分配一个空闲的线程执行
c.若所有线程处于忙碌状态,新任务要么放入队列等待,要么增加一个新线程进行处理。

二、线程池创建

ExecutorService是接口,它常用的创建方式可以通过Executors的方法来创建。
在这里插入图片描述

三、Executors源码解读

为这些对象提供工厂和实用方法:在concurrent包中定义的ExecutorExecutorServiceScheduledExecutorServiceThreadFactoryCallable类。

提供的方法返回结果类型有:
a.常规配置的ExecutorService
b.常规配置的ScheduledExecutorService
c.禁止修改配置的封装后的ExecutorService
(d.将新创建的线程设置为已知状态的ThreadFactory
(e.在其他类似封闭(closure-like)的形式以外的Callable
本文主要讨论前三种。

newFixedThreadPool()
public static ExecutorService newFixedThreadPool(int nThreads)

Executors创建一个线程池,该线程池复用固定数量的线程,线程操作在共享的无界队列。在任何时候,最多nThreads个线程将正在运行处理任务。

如果在所有线程都处于忙碌状态时,提交了其他任务,它们将在队列中等待,直到有线程可用。

如果任何线程因执行期间的失败而终止,且在关闭之前,如果后续任务需要执行,一个新线程将取而代之。

池中的线程会一直存在,直到明确调用ExecutorServiceshutdown方法。

a.参数:
nThreads 池中的线程数
b.返回:
ExecutorService 新创建的线程池
c.异常
throws IllegalArgumentException
如果nThreads个数小于等于0时

newWorkStealingPool()
public static ExecutorService newWorkStealingPool(int parallelism)

创建一个线程池,它维持足够的线程来支持给定的并行度级别parallelism,并且可能会使用多个队列来减少争用。

并行度级别对应于最大的活跃线程参与数量、或可用于参与任务处理的线程数。线程的实际数量可能动态增长和收缩。work-stealing线程池不保证提交任务的执行顺序。

a.参数:
parallelism 目标并行度级别
b.返回:
ExecutorService 新创建的线程池
c.异常
throws IllegalArgumentException
如果nThreads个数小于等于0时

public static ExecutorService newWorkStealingPool()

创建一个work-stealing线程池,使用所有Runtime中的availableProcessors(可用处理器)作为其目标并行度级别。

a.参数:无
b.返回:
ExecutorService 新创建的线程池
c.异常
throws IllegalArgumentException
如果nThreads个数小于等于0时

newSingleThreadExecutor()
public static ExecutorService newSingleThreadExecutor()

创建一个使用单个工作线程无界队列中操作的Executor

请注意,如果这个单个线程由于在关闭之前的执行过程中失败而终止,如果后续任务需要执行,一个新线程将取而代之。

会保证任务按顺序执行,并且不超过一个任务,在任何给定时间内处于活跃状态。与其他等效的newFixedThreadPool(1)不同,返回的执行器保证不可重新配置以使用其他线程

a.参数:无
b.返回:
ExecutorService 新创建的线程池
c.异常:无

newCachedThreadPool()
public static ExecutorService newCachedThreadPool()

创建一个线程池,根据需要创建线程,但之前构建的线程可用时会复用它们。这些线程池通常会提高程序(execute执行许多短期异步任务的)的性能。

调用execute将复用先前构造的线程(如果可用)。如果没有可用的现有线程,则会创建一个新的线程并将其添加到线程池中。

60 秒内未使用的线程将被终止并从缓存中移除。因此,保持空闲足够长时间的线程池将不会消耗任何资源。

请注意,可以使用ThreadPoolExecutor构造函数创建具有相似属性但不同细节(例如,超时参数)的池。

a.参数:无
b.返回:
ExecutorService 新创建的线程池
c.异常:无

newSingleThreadScheduledExecutor()
public static ScheduledExecutorService newSingleThreadScheduledExecutor()

创建一个单线程执行器executor,它可以安排命令在给定的延迟后运行,或定期执行

但是请注意,如果这个单一的线程在关闭之前的执行过程中由于失败而终止,如果后续任务需要执行,一个新的线程将取而代之。

会保证任务按顺序执行,并且不超过一项任务将在任何给定时间处于活跃状态。与其他等效的newScheduledThreadPool(1)不同,返回的执行器保证不可重新配置以使用其他线程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值