ThreadPoolExecutor的内部类Worker详细解析

一、定义

ThreadPoolExecutor 的内部类 Worker 是线程池的核心实现之一,它封装了线程和任务,并负责执行任务。Worker 类继承自 AbstractQueuedSynchronizer(AQS),

并实现了 Runnable 接口。通过 Worker,线程池能够高效地管理线程的生命周期和任务的执行


1、Worker 类的设计目的

Worker 类的主要作用是:

1、封装线程和任务:将线程和任务绑定在一起,确保任务能够被正确执行。

2、管理线程的生命周期:通过 Worker,线程池可以控制线程的创建、执行和销毁。

3、实现任务的执行逻辑:Worker 的 run 方法会从任务队列中获取任务并执行


2、Worker 类的核心字段

Worker 类包含以下核心字段:

  • thread:Worker 封装的线程对象,用于执行任务。

  • firstTask:Worker 的初始任务。如果为 null,线程会从任务队列中获取任务。

  • completedTasks:记录 Worker 完成的任务数量。


3、构造函数

Worker 的构造函数用于初始化线程和任务:

  • setState(-1):将 AQS 的状态设置为 -1,防止线程在启动前被中断。

  • firstTask:传入的初始任务。

  • thread:通过线程工厂创建的新线程,Worker 本身作为 Runnable 传递给线程。


4、常用方法


4.1、run 方法

Worker 的 run 方法是线程执行的入口,它会调用 ThreadPoolExecutor.runWorker 方法:

  • runWorker:ThreadPoolExecutor 的方法,用于执行任务


4.2、runWorker 方法

runWorker 是 Worker 执行任务的核心逻辑:

  • getTask():从任务队列中获取任务。

  • beforeExecute 和 afterExecute:任务执行前后的钩子方法,可以被子类重写。

  • processWorkerExit:处理线程退出逻辑。


4.3、getTask 方法

getTask 方法用于从任务队列中获取任务:

  • workQueue.poll:如果允许超时,则使用 poll 方法从队列中获取任务。

  • workQueue.take:如果不允许超时,则使用 take 方法从队列中获取任务。


5、工作原理


1、初始化:

  • 创建 Worker 对象时,会初始化 firstTask 和 thread。

  • 调用 thread.start() 启动线程,线程会执行 Worker 的 run 方法。


2、执行任务:

  • run 方法调用 runWorker,开始执行任务。

  • 如果 firstTask 不为空,则执行 firstTask。

  • 如果 firstTask 为空,则调用 getTask 从任务队列中获取任务。


3、任务循环:

  • runWorker 方法会不断从任务队列中获取任务并执行。

  • 每次执行任务前会调用 beforeExecute,执行后会调用 afterExecute。


4、线程退出:

  • 当 getTask 返回 null 时,表示线程需要退出。

  • 调用 processWorkerExit 方法处理线程退出逻辑。


二、总结

Worker 是 ThreadPoolExecutor 的核心内部类,负责封装线程和任务,并实现任务的执行逻辑。它的主要特点包括:

1、封装线程和任务:通过 thread 和 firstTask 字段绑定线程和任务。

2、任务执行逻辑:通过 runWorker 方法从任务队列中获取任务并执行。

3、锁机制:继承自 AQS,用于防止任务被中断和控制线程的生命周期。

posted @ 2025-02-23 01:08  jock_javaEE  阅读(66)  评论(0)    收藏  举报