> 日常维修
java线程池关闭后怎么再次打开(java线程池关闭流程)
导语:Java线程池的关闭
一 java线程池关闭方法1.1 shutdownvoid shutdown() 此方法关闭线程池不是直接关闭,需要等待线程池中的正在执行的和在队列中的任务都执行完毕后,才真正关闭线程池,调用这个方法后,如果再对线程池提交任务,会根据拒绝策略来拒绝任务。
1.2 shutdownnowList<Runnable> shutdownNow() 从字面意思来看是立刻关闭线程池,它首先会给所有线程池中的线程发interrupt 中断信号进行中断正在执行的任务,并将任务队列中的任务放到一个list队列中返回。 我们可以对这个list进行相关的处理。
源码如下:
public List<Runnable> shutdownNow() { List<Runnable> tasks; final ReentrantLock mainLock = this.mainLock; mainLock.lock(); try { checkShutdownAccess(); advanceRunState(STOP); // 发送中断信号 interruptWorkers(); tasks = drainQueue(); } finally { mainLock.unlock(); } tryTerminate(); return tasks; }
1.3 awaitTermination并不关闭线程,而是等待线程终止,等待的时间是传入的,比如等待10s,会在以下情况下返回:
等待期间,线程池已经关闭,且所有提交的任务均执行完毕,方法返回true。超时后,线程池未终止,返回false。等待期间线程被中断,会抛出InterruptedException 异常。简单来说,线程池终止了方法返回true,其他返回false。一般用shutdown调用后,用这个方法等待一段时间,如果时间太长,再调用shutdownnow去关闭。
二 状态判断2.1 isShutdownboolean isShutdown(),此方法在线程已经开始关闭的时候返回true,其他时候返回false,即是否调用了线程池的shutdown或shutdownnow方法,返回true不代表线程池已经终止了,还有可能是需要线程池需要等待正在执行的任务或任务队列中的任务执行完。
2.2 isTerminated此方法返回true表示线程池的所有任务都执行完毕了,线程池终结了;如果线程池调用了shutdown,但是任务还没执行完,isShutdown返回true,而isTerminated返回false。
本文内容由小林整理编辑!