Java 并发编程(六) -- ThreadPoolExecutor中的Worker

301 阅读2分钟

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) {
                }
            }
        }