其他分享
首页 > 其他分享> > 线程池关闭及等待关闭方法

线程池关闭及等待关闭方法

作者:互联网

1.shutdown方法

//不会接收新任务,但会继续处理队列中的任务
public void shutdown() {
        final ReentrantLock mainLock = this.mainLock;
        mainLock.lock();
        try {
            //校验权限(如果没有声明或者配置SecurityManager,是会通过的)
            checkShutdownAccess();
            //线程池状态设置为SHUTDOWN状态,
            advanceRunState(SHUTDOWN);
            //interrupt 空闲工作线程
            interruptIdleWorkers();
            onShutdown(); // hook for ScheduledThreadPoolExecutor
        } finally {
            mainLock.unlock();
        }
        tryTerminate();
    }

interruptIdleWorkers方法

private void interruptIdleWorkers(boolean onlyOne) {
    final ReentrantLock mainLock = this.mainLock;
    mainLock.lock();
    try {
        for (Worker w : workers) {
            Thread t = w.thread;
            //w.tryLock(),尝试获取锁(如果能获取到,说明没有在执行任务,可中断)
            //在runWorker  w.lock和w.unlock之间的不会中断
            if (!t.isInterrupted() && w.tryLock()) {
                try {
                    t.interrupt();
                } catch (SecurityException ignore) {
                } finally {
                    w.unlock();
                }
            }
            if (onlyOne)
                break;
        }
    } finally {
        mainLock.unlock();
    }
}

2.shutdownNow方法

//不接受新任务,不处理队列中的任务,并中断正在进行的任务(中断线程,但当前任务会继续执行完在结束)
public List<Runnable> shutdownNow() {
    List<Runnable> tasks;
    final ReentrantLock mainLock = this.mainLock;
    mainLock.lock();
    try {
        //检查是否有权限关闭线程池,和中断工作线程
        checkShutdownAccess();
        //线程池状态设置为STOP状态,
        advanceRunState(STOP);
        //interrupt所有已经启动(start())的工作线程(runWorker->w.unlock()之后)
        interruptWorkers();
        //清空队列中的任务,并返回未处理的任务
        tasks = drainQueue();
    } finally {
        mainLock.unlock();
    }
    //尝试终止线程池
    tryTerminate();
    return tasks;
}

interruptIfStarted

shutdownNow-> interruptWorkers-> interruptIfStarted,

//中断已经执行runworker的工作线程
void interruptIfStarted() {
    Thread t;
    //w.unlock:state=0;w.lock:state=1,在执行到runWorker,w.unlock时就可以中断了
    if (getState() >= 0 && (t = thread) != null && !t.isInterrupted()) {
        try {
            t.interrupt();
        } catch (SecurityException ignore) {
        }
    }
}

3.awaitTermination

这个不是关闭方法,是可阻塞等待线程池关闭的方法

//1:在超时(timeout)后仍未结束,返回false
//2: 在线程池终止时,会返回true
public boolean awaitTermination(long timeout, TimeUnit unit)
    throws InterruptedException {
    //以纳秒为单位,阻塞的最大时间,超过这个时间,如果线程池还没终止,返回false
    long nanos = unit.toNanos(timeout);
    final ReentrantLock mainLock = this.mainLock;
    mainLock.lock();
    try {
        for (;;) {
            //如果线程池已经终止了。返回true
            if (runStateAtLeast(ctl.get(), TERMINATED))
                return true;
            //如果超时了,返回false
            if (nanos <= 0)
                return false;
            //阻塞方法,直到时间超过nanos或者通过tryTerminate()->termination.signalAll();唤醒
            nanos = termination.awaitNanos(nanos);
        }
    } finally {
        mainLock.unlock();
    }
}

标签:mainLock,lock,finally,try,unlock,线程,关闭,等待
来源: https://www.cnblogs.com/shuiyingyuan/p/15258183.html