首先,我们需要考虑为什么我们使用线程池。Java为我们提供多个线程的机制,使我们同时运行多个任务,就像多个任务同时执行了多个任务,而不是同时执行按顺序执行这些任务。但是,如果我们每次执行任务时都创建线程,则该问题是引起的
因此,Java提供了默认线程池来帮助您解决这些问题。通过ThreadPoolExecutor,我们可以实现各种线程来创建回收策略以适应不同的需求方案。
可以在线程池中使用的场景可用
要正确使用线程池,我们需要了解几个重要参数,并且可以通过threadpoolexecutor的构造函数看到这些参数
了解这些参数后,我们可以创建一个线程池并使用它。通过下面的评论,我们对线程池的使用和机制有初步的了解,稍后将详细分析。
了解使用ThreadPoolExecutor的使用后,我们通过图片查看线程池的内部体系结构
从上图可以看出,ThreadPoolExecutor的更重要组成部分是WorkerPool(Workline Pool),Workqueue(Task Queue),RepctionExeCutionHandler。
整个ThreadPooleExecutor中更重要的部分是
首先查看线程池的状态。线程池在每个状态中总共有5个状态
州机器如下
首先查看执行threadpoolexecutor的执行逻辑。流程图如下如下
可以通过代码中的注释来查看更多详细信息。
ADDWORKER方法负责创建一个工作对象。首先查看工作类的内容。工作类需要区分其是否正在等待任务完成任务或执行任务。工人可以通过不可用的锁实现。您可以首先获得锁来执行任务。
这是为了区分等待和执行任务的中断。
为了防止已处理的工作任务,在任务处理任务中调用CorePoolsize时,您将被锁定,然后转到每个工作人员的中断。如果您可以输入它,它也会中断线程以中断并导致运行任务被中断。仅在线程池处于停止状态后,就可以在运行任务中中断线程。
看一下工人课的定义
查看包含Worker的任务采集和执行逻辑的Runworker方法。
GetTask方法负责从任务队列连续获得任务。其中,您可以看到,当线程可以回收时,将使用keepalivetime时间来获取可用空闲时间后可以实现的轮询线程。
现有任务将继续执行,但不会接受新任务
derdownnow方法,关闭的差异是将状态修改为停止,并在队列中排出任务流失
try端方法将尝试关闭线程池
在下文中,队列积累的问题会导致OOM同步式同步阻塞队列。该队列是没有长度的队列,以确保尽快处理任务,以优先级阻止队列延迟延迟延迟队列。这是一个常见的拒绝excutionhandler
当然,要执行此任务,我们还可以自定义拒绝策略,例如实施阻止提交线程的拒绝策略。这可以减慢提交者的速度,例如Callerrunspolicy,但不要使用提交线程执行任务。
ThreadPoolExecutor还提供参数,例如修改参数,例如CorePoolSize和MaximumpoolSize,以便我们可以动态调整线程池的参数。
如何修改队列的长度?我们可以实现变量 - 长度阻止队列。通过添加队列以根据LinkedBlockingQueue修改容量来更容易实现,因为LinkedBlockingQueue的容量不会将其存储为Irayblockingqueue。