一、定义
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,用于防止任务被中断和控制线程的生命周期。