当前位置: 首页 > 网络应用技术

关闭线程池关闭和关闭点之间的区别?

时间:2023-03-06 00:56:01 网络应用技术

  本章分为两个主题

  结果

  执行完成后,主线程将始终被阻止,因此如何关闭线程池?本章介绍了关闭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