快捷搜索: 王者荣耀 脱发

源码阅读 - 线程池:线程池原理(十)Worker内部类

该文章介绍了worker类,即是线程池的工作线程,讨论了该类的一些特性。

Worker继承AQS抽象类,继承AQS可以获得互斥访问的能力,我们在ThreadPoolExecutor会看到runWorker和interruptIdleWorkers中存在w.lock()的操作,原因是为了防止对正在运行的线程造成影响。由于运行状态的线程处于加锁状态,所以可以通过tryLock判断线程处于空闲还是运行。 实现Runnable,run中运行的时runWorker逻辑。

private final class Worker
    extends AbstractQueuedSynchronizer
    implements Runnable{
          
   
    private static final long serialVersionUID = 6138294804551838833L;

    // 工作线程
    final Thread thread;
    // 初始任务,只在worker第一次执行任务的时候执行,之后都是从workQueue中获取任务执行
    Runnable firstTask;
    //计算完成的任务
    volatile long completedTasks;

    Worker(Runnable firstTask) {
          
   
        setState(-1); // 禁止interrupt直到runWorker
        this.firstTask = firstTask;
        this.thread = getThreadFactory().newThread(this);
    }

    public void run() {
          
   
        runWorker(this);
    }

    protected boolean isHeldExclusively() {
          
   
        return getState() != 0;
    }

    protected boolean tryAcquire(int unused) {
          
   
        if (compareAndSetState(0, 1)) {
          
   
            setExclusiveOwnerThread(Thread.currentThread());
            return true;
        }
        return false;
    }

    protected boolean tryRelease(int unused) {
          
   
        setExclusiveOwnerThread(null);
        setState(0);
        return true;
    }
    
    public void lock()        {
          
    acquire(1); }
    public boolean tryLock()  {
          
    return tryAcquire(1); }
    public void unlock()      {
          
                (1); }
    public boolean isLocked() {
          
    return isHeldExclusively(); }
    
    void interruptIfStarted() {
          
   
        Thread t;
        if (getState() >= 0 && (t = thread) != null && !t.isInterrupted()) {
          
   
            try {
          
   
                t.interrupt();
            } catch (SecurityException ignore) {
          
   
            }
        }
    }
}
经验分享 程序员 微信小程序 职场和发展