【线程池】如何正确的关闭线程池

邓敏 2021年12月26日 98次浏览

关闭线程池的方法

shutdown()

在调用这个关闭方法时,线程池会根据我们配置的拒绝策略来拒绝掉想要进来的线程,也就是说吧创建执行线程的入口给关闭掉了,直到线程池内的所有线程都执行完成。在调用这个方法完毕之后,并不代表这个线程池就真的都停掉了,只能说他不让其他线程进来了,然后等到线程池内的线程执行完。

shutdownNow()

shutdownNow相对于shutdown的加强版,因为他可以加快线程的执行的的关闭速度,通过向线程池中的线程发送interrupt中断信号来达到让线程尽快结束的目的,于此同时也会和shutdown方法一样,根据拒绝策略来拒绝掉想要进来的线程。

判断线程池是否关闭的方法

isShutdown()

这个方法就是用来判断我们线程是否开始执行了shutdown方法,当没有调用shutdown方法时,isShutdown返回的false,如果调用了shutdown方法,这个时候isShutdown返回的则是ture,值的注意的是,当isShutdown返回true并不代表这个线程池是关闭状态了,这个方法只代表着线程有没有开始执行线程关闭的方法。

isTerminated()

isTerminated就表示着线程池还有没有线程正在执行,如果当还有线程未执行完成,那么他就会返回false,当线程中所有的任务都执行完成了,那么他才会返回ture。他跟isShutdown不同的是,isShutdown方法表示有没有开始停止线程池任务,而isTerminated表示的是,停止线程池的任务有没有执行完成。

awaitTermination()

与isTerminated不同的是,awaitTermination有一个等待时间,如果将等待时间设置为10s,那么在执行这个方法后,awaitTermination方法会等待10s,如果10s内所有的线程都执行完成了,他就会提前返回ture,反之如果到了10s后所有的方法还没有执行完毕,则会返回false。在等待的同时,如果当先等待的线程收到了interrupt中断信号,同样的他也会跑出interrupt的异常。

总结

上面结束的五个方法,其实都是很好的去解决我们业务中常见的停止线程的场景。只要我们将这些方法的作用吃透。在停止线程池的时候,根据我们自己需要的场景来去停止,这样其实就可以达到了正确停止线程池的目的了。