一、Worker的真实身份
Worker是线程池的内部类。包装了一个线程来不断的执行任务。线程池中的每个线程都被包装成了Worker类,它具有以下特点:
1、它实现了Runnable,内部线程start后,执行的就是Worker本身的run方法。
2、它继承了AQS,实现了一个不可重入的独占锁,执行任务期间加锁。线程池可以通过tryLock来判断Worker是不是正在执行任务。
二、Worker的创建与销毁
1、Worker的创建
线程池在接收提交任务阶段,会根据当前线程数量,决定是否创建线程。如下代码:
public void execute(Runnable command) {
if (command == null)
throw new NullPointerException();
int c = ctl.get();
if (workerCountOf(c) < corePoolSize) {
if (addWorker(command, true))
return;
c = ctl.get();
}
if (isRunning(c) && workQueue.offer(command)) {
int recheck = ctl.get();
if (! isRunning(recheck) && remove(command))
reject(command);
else if (workerCountOf(recheck) == 0)
addWorker(null, false);
}
else if (!addWorker(command, false))
reject(command);
}
通过上面的源代码,我们会发现有三个地方调用addWorker()方法,而此方法的内部则会创建Worker对象,并完成提交任务的执行。下面,来看看Worker的内部结构:
private final class Worker extends AbstractQueuedSynchronizer implements Runnable {
private static final long serialVersionUID = 6138294804551838833L;
/** 线程池里的真正的线程,负责执行提交的任务。*/
final Thread thread;
/**Worker线程执行的第一个任务,如果创建的是核心线程的Worker则提交的任务会赋值给此属性。此值可为空*/
Runnable firstTask;
/** 当前线程已完成的任务数,每次执行玩一个提交的任务,此值+1 */
volatile long completedTasks;
}
接下来,我们看下构造函数:
Worker(Runnable firstTask) {
setState(-1); // inhibit interrupts until runWorker
this.firstTask = firstTask;
this.thread = getThreadFactory().ne