1. 类的定义
private final class Worker extends AbstractQueuedSynchronizer implements Runnable
从类的定义中可以看出
- Worker继承了AbstractQueuedSynchronizer(AQS)
- Worker实现了Runnable接口
2. 字段属性
//序列化版本号
private static final long serialVersionUID = 6138294804551838833L;
//当前工作运行的线程
final Thread thread;
//工作线程要运行的任务
Runnable firstTask;
//已经完成的任务统计
volatile long completedTasks;
从字段属性可以看出
- Worker中包含了一个Thread对象,这个是Worker运行的核心
- Worker中包含了一个Runnable对象,Thread执行的任务目标
- Worker存储了完成任务的统计
3. 构造方法
//传入一个Runnable对象
Worker(Runnable firstTask) {
//设置同步状态,这个是AQS的方法
setState(-1); // inhibit interrupts until runWorker
//设置运行任务,可能为null
this.firstTask = firstTask;
//使用线程工厂创建一个新的线程
this.thread = getThreadFactory().newThread(this);
}
构造方法主要是做一些初始化操作
4. 方法
run 方法
//启动worker
public void run() {
//调用ThreadPoolExecutor的runWork方法,循环去工作队列中获取任务运行
runWorker(this);
}
isHeldExclusively 方法
//判断当前是否处于上锁状态,true 未上锁状态, false 上锁状态
protected boolean isHeldExclusively() {
//state 0:unlocked state 1:locked state
return getState() != 0;
}
tryAcquire 方法
//尝试上锁
protected boolean tryAcquire(int unused) {
//使用CAS设置state值为1
if (compareAndSetState(0, 1)) {
//设置当前线程独占访问方式设置为调用线程
//设置抢到锁的线程未当前调用线程,这个是AQS的方法
setExclusiveOwnerThread(Thread.currentThread());
//成功返回true
return true;
}
//CAS失败返回false
return false;
}
tryRelease 方法
//尝试解锁
protected boolean tryRelease(int unused) {
//把当前线程独占访问方式设置为null,这个是AQS的方法
//把当前抢到锁的线程置为null
setExclusiveOwnerThread(null);
//state设置为0,
setState(0);
//返回true
return true;
}
lock 方法
//上锁
public void lock() {
//调用acquire方法,这个是AQS的方法
acquire(1);
}
tryLock 方法
//尝试上锁
public boolean tryLock() {
//调用tryAcquire方法
return tryAcquire(1);
}
unlock 方法
//解锁
public void unlock() {
//调用release方法,这个是AQS的方法
release(1);
}
isLocked 方法
//检查是否有所
public boolean isLocked() {
//调用isHeldExclusively方法判断
return isHeldExclusively();
}
interruptIfStarted 方法
//中断工作的线程
void interruptIfStarted() {
Thread t;
//getState() >= 0 表示不是初始状态,初始状态为-1
//当前线程不为null并且不是中断状态
if (getState() >= 0 && (t = thread) != null && !t.isInterrupted()) {
try {
//调用线程的中断方法
t.interrupt();
} catch (SecurityException ignore) {
}
}
}