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

    private void interruptWorkers() {
        final ReentrantLock mainLock = this.mainLock;
        mainLock.lock();
        try {
            for (Worker w : workers)
                w.interruptIfStarted();
        } finally {
            mainLock.unlock();
        }

    }

这个方法是打断worker的方法

获取mainLock 然后锁定

遍历每个worker 调用interrupIfStarted方法进行阻塞 最后解锁


    private void interruptIdleWorkers(boolean onlyOne) {
        final ReentrantLock mainLock = this.mainLock;
        mainLock.lock();
        try {
            for (Worker w : workers) {
                Thread t = w.thread;
                if (!t.isInterrupted() && w.tryLock()) {
                    try {
                        t.interrupt();
                    } catch (SecurityException ignore) {
                    } finally {
                        w.unlock();
                    }
                }
                if (onlyOne)
                    break;
            }
        } finally {
            mainLock.unlock();
        }
    }

这个是打断空闲worker的方法 参数为true代表只打断一个

先获取mainLock 然后锁定

遍历每个worker 

获取每个worker的线程 

判断如果线程没有被打断 且worker由这个线程独占

就调用线程的interrupt方法打断线程 

解锁worker与该线程

如果参数为true 那么打断了一个空闲线程之后就退出for循环 

最后解锁mainLock


    private void interruptIdleWorkers() {
        interruptIdleWorkers(false);
    }

这个方法就是对上面的调用 传了false

    private static final boolean ONLY_ONE = true;

ONLY_ONE属性 默认为true


    final void reject(Runnable command) {
        handler.rejectedExecution(command, this);
    }

这个是拒绝的方法 调用handler属性的方法


    void onShutdown() {
    }

关闭方法 空实现


    final boolean isRunningOrShutdown(boolean shutdownOK) {
        int rs = runStateOf(ctl.get());
        return rs == RUNNING || (rs == SHUTDOWN && shutdownOK);
    }

判断是RUNNING或SHUTDOWN状态的方法

获取状态 然后判断 没什么可说的

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值