源码阅读 - 线程池:线程池原理(十)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) {
            }
        }
    }
}

源码阅读 - 线程池:线程池原理(一)线程池概述
源码阅读 - 线程池: 线程池原理(二)线程池构造函数解析
源码阅读 - 线程池:线程池原理(三)线程池的状态解析
源码阅读 - 线程池:线程池原理(四)addWorker–execute方法的前奏
源码阅读 - 线程池:线程池原理(五)一个execute(Runnable)调用经历了什么?
源码阅读 - 线程池:线程池原理(六)线程的任务调度和执行runWoker
源码阅读 - 线程池:线程池原理(七)线程池的关闭
源码阅读 - 线程池:线程池原理(八)ThreadPoolExecutor
源码阅读 -线程池:线程池原理(九)相关接口介绍
源码阅读 - 线程池:线程池原理(十)Worker内部类

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木子的木木

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值