共同学习Java源代码-多线程与并发-ThreadPoolExecutor类(三)

    private static final RuntimePermission shutdownPerm =

        new RuntimePermission("modifyThread");

调用shutdown和shutdownNow的权限


这是Worker类 实现了

    private final class Worker
        extends AbstractQueuedSynchronizer
        implements Runnable

继承自AQS 实现了Runnable接口
    {
        
        private static final long serialVersionUID = 6138294804551838833L;


        /** Thread this worker is running in.  Null if factory fails. */
        final Thread thread;

这个Worker跑在这个线程里


        Runnable firstTask;

初始任务

        volatile long completedTasks;

已完成的任务数

        Worker(Runnable firstTask) {
            setState(-1); // inhibit interrupts until runWorker
            this.firstTask = firstTask;
            this.thread = getThreadFactory().newThread(this);
        }
构造方法 

首先设置状态 调用的AQS的方法

将参数的Runnable传给firstTask

调用getThreadFactory方法获取线程工厂创建新线程 赋给thread属性

        public void run() {
            runWorker(this);
        }
run方法 调用runWorker


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

判断是否是否被一个线程独占 就是判断状态 0的话是非被占有 1的话是被占有

        protected boolean tryAcquire(int unused) {
            if (compareAndSetState(0, 1)) {
                setExclusiveOwnerThread(Thread.currentThread());
                return true;
            }
            return false;
        }
试图获取这个Worker的锁 调用AQS的cas方法给worker状态赋为1 然后将worker的独有线程设置为当前线程

        protected boolean tryRelease(int unused) {
            setExclusiveOwnerThread(null);
            setState(0);
            return true;
        }
试图释放线程独占的方法 先将独占线程设为空 然后将状态设为0 然后返回true

        public void lock()        { acquire(1); }


        public boolean tryLock()  { return tryAcquire(1); }

        public void unlock()      { release(1); }

        public boolean isLocked() { return isHeldExclusively(); }
被锁 试图被锁 解锁 是否被锁的方法 都是调用 就是线程是否获取这个worker的锁的相关方法 

        void interruptIfStarted() {
            Thread t;
            if (getState() >= 0 && (t = thread) != null && !t.isInterrupted()) {
                try {
                    t.interrupt();
                } catch (SecurityException ignore) {
                }
            }
        }

打断已经开始的线程的方法

判断状态是否大于0 且thread不为空 且thread没有被打断 

就试图去中断线程
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值