本章分为两个主题
结果
执行完成后,主线程将始终被阻止,因此如何关闭线程池?本章介绍了关闭TreadPoolExecutor中关闭线程池的5种方法,如下所示
第一个方法称为shutdown()。它可以安全地关闭线程池并调用shutdown()方法。这是大量的任务,等待在任务队列中执行。在执行执行的任务以及队列中等待的任务后,呼叫shutdown()方法返回线程池将完全关闭。
调用shutdown()方法后,如果仍然提交了新任务,则线程池将直接根据拒绝策略直接拒绝随后的新提交任务。
此源代码位置(JDK 1.8版本)
java.util.concurrent.threadpoolexecutor#execute
1373戒指(!isrunning(rec -heck)&& remove(命令))如果线程池已关闭,则将当前任务成功从任务队列中删除并拒绝了任务的任务
1378如果(!addworker(命令,false))如果新线程失败,则表示线程池已关闭或线程池已满,并且任务被拒绝。
第二种方法称为ISSHUTDOWN(),可以返回真或错误以确定线程池是否已开始关闭,即是否执行关闭还是关闭方法。
应该在这里注意到,如果调用isshutdown()方法的结果是,true并不意味着此时线程池已完全关闭,这仅表示线程池的关闭过程。线程可能可以还要有一个任务等待在队列中执行。
第三种方法称为ISTERMIND()。此方法可以检测线程池是否真的“结束”。这不仅意味着线程池已关闭,而且还执行了线程池中的任务。
例如,我们上面提到的内容,如果此时调用了关闭方法,但是仍然有未执行的任务,然后调用Isshutdown方法将返回到true,而ISTERMINDERD方法将返回false。
直到所有任务都完成,并且ISTERMIND()方法调用True,这意味着线程池已关闭,线程池的内部为空,并且所有其余任务已执行。
第四种方法称为等待()。它不用于关闭线程池,而是主要用于判断线程池的状态。
例如,等待方法的参数持续10秒,然后将落入10秒钟的等待中,直到以下三种情况之一:
在等待期间(包括进入等待状态之前),线程池已关闭,并且所有提交的任务(包括队列中的等待)已完成。这是等同于超时时间,第一个线程池的“结束”的情况从未发生过。该方法返回false并等待线程被打断。在等待时间,线程池已关闭并执行了内部任务,这意味着线程池确实是“结束的”,然后该方法返回true true,否则,超时将返回Fasle。
最后一个方法是shutdownnow()。IT和关闭()之间的区别在于,现在又意味着它立即意味着。不建议使用此方法关闭线程池。
执行关闭方法后,首先将中断信号发送到所有线程池中的线程,尝试中断这些任务的执行,然后将在任务队列中等待的所有任务转移到列表中并返回。我们可以根据返回申报表返回。任务列表执行一些补救措施,例如案例中记录并以后重试。
shutDownnow源代码如下:
互换者
让每个已激活的线程中断,以便线程可以检测中断信号并在执行任务期间相应地进行,并预先结束任务
原始链接:https://blog.csdn.net/xiewenfeng520/article/details/107013342