jdk线程池原理

	**jdk线程池原理**

本文主要是对jdk源生线程池的源码注释的翻译,jdk版本为1.8.0_212。
java.util.concurrent.ThreadPoolExecutor继承AbstractExecutorService,AbstractExecutorService实现了ExecutorService接口,ExecutorService继承自Executor接口。
execute方法何时被执行?
execute方法的执行逻辑?

ExecutorService是使用几个池化的线程中的一个线程执行每一个被提交的任务,通常情况下是使用Executors的工厂方法配置的线程池。

线程池解决了两个不同的问题,这两个问题在执行大量的异步任务的时候通常会提供更高的性能。主要是因为减少了每个任务的调用开销,并且它们提供了一种限制和管理线程资源的方式,包括线程、执行一个任务集合的消耗。每一个ThreadPoolExecutor也提供一些基本的统计信息,比如完成的任务数量等。

为了在大量的上下文环境中是可用的,这个类提供了许多可调节的参数和扩展性的钩子方法。然而,程序员们被期望使用更方便实用的Executors的工厂方法,比如Executors.newCachedThreadPool(没有限定的线程池,自动线程管理),Executors.newFixedThreadPool(固定数量的线程池)和Executors.newSingleThreadExecutor(单个后台线程),这些方法已经预先对最常用的线程池使用场景进行了配置。另外,也可以手动配置线程池类的参数。
核心线程数
最大线程数
一个ThreadPoolExecutor实例会根据核心线程数和最大线程数自动调整线程池的大小。
当一个新的任务被提交到execute方法的时候,如果正在运行(应该是指没有被销毁)的线程的数量小于核心线程数,即使线程池中有其他可用的线程,线程池也会创建一个新的线程处理这个请求。如果线程数量大于核心线程数,小于最大线程数,只有当队列满的时候才会创建新的线程。如果将核心线程数和最大线程数设置为一样,创建的就是一个固定大小的线程池,如果将最大线程数设置为一个本质上无上限的值,比如Integer.MAX_VALUE,创建的就是允许线程池容纳任意数量的并发任务。最典型的做法是,只在构造方法上设置核心线程数和最大线程数,但是也可以被setCorePoolSize和setMaximunPoolSize这两个方法动态的改变。

	构造方法

默认情况下,只有心的任务被提交的时候,核心线程才会被初始化创建和启动,但是这也可以被prestartCoreThread或者prestartAllCoreThread方法动态覆盖。当你创建一个队列非空的线程池的话,你可能会想要预先启动线程。

	创建新的线程

线程池中的新线程是使用ThreadFactory创建的。如果没有其他的特别指定,线程池的构造方法会使用Executors.defaultThreadFactory方法,创建的所有线程都是相同的线程组、默认的优先级(5),非守护线程状态。如果使用一个其他的线程工厂类,你可以指定线程的名字,线程组,优先级,守护状态等。如果线程工厂创建线程失败,执行器会继续工作,但是可能不能执行任何任务。线程应该处理“modifyThread”。如果工作线程或者其他使用这个线程池的线程不处理这个权限,服务可能会被降级:配置变更不会立马生效,shutdown线程池会停留在可能终止的状态,但不是完全终止。

	存活时间

如果线程池当前线程数量多于核心线程数,并且超过核心线程数的线程处在空闲状态的时间超过指定的存活时间会被终止。在线程池并不是很活跃的时候,这提供了一种减少资源消耗的手段。如果线程池在稍后的时间变得更活跃了,新的线程会被创建。这个参数也可以使用setKeepAliveTime方法动态地改变。使用Long.MAX_VALUE可以有效的避免空闲线程被终止。默认情况下,keep-alive 策略仅仅适用在线程数量多于核心线程数的场景,但是allowCoreThreadTimeOut方法可以把这种超时策略应用在核心线程上,只要keepAliveTime的值是非零的。

	队列

任何实现了BlockingQueue接口的类都可以被用来转发和保存提交的任务。队列的使用和线程池的数量相关。
如果正在运行的线程数量少于核心线程数,执行器会优先创建一个新的线程,而不是将任务入队。
如果超过核心线程数的线程在运行,执行器总是会优先将请求入队列,而不是创建一个新的线程。
如果一个请求不能被加入到队列中,线程池会创建一个新的线程,直到达到最大线程数。如果达到最大线程数,这个任务会被拒绝。

	线程排队的三种策略

SynchronousQueue、LinkedBlockingQueue、ArrayBlockingQueue

	拒绝策略

	主要方法描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值