当前位置: 首页 > 网络应用技术

分析最强的线程池,您真的知道线程池的这些细节吗?

时间:2023-03-06 01:02:05 网络应用技术

  首先,我们需要考虑为什么我们使用线程池。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。