深入浅出多线程编程实战(八)优雅关闭线程池

深入浅出多线程编程实战(八)优雅关闭线程池

文章目录

  • 前言
  • 一、关闭线程池的方法
    • 1.ShutDown
    • 2.ShutDownNow
    • 3.awaitTermination
    • 4.isShutDown
    • 5.isTerminated
  • 结尾


前言

我们经常在项目中使用的线程池,但是是否关心过线程池的关闭呢,可能很多时候直接再项目中直接创建线程池让它一直运行当任务执行结束不在需要了也不去关闭,这其实是存在非常大的风险的,大量的线程常驻在后台对系统资源的占用是巨大的 ,甚至引发异常。所以在我们平时使用线程池时需要注意优雅的关闭,这样可以保证资源的管控;

一、关闭线程池的方法

  • void shutdown()
  • List shutDownNow
  • boolean awaitTermination
  • boolean isShutDown
  • boolean isTerminated

1.ShutDown

线程会正常执行结束后再关闭线程池,对于 ShutDown 而言它可以安全的停止一个线程池,它有几个关键点:
  • ShutDown 会首先将线程设置成 SHUTDOWN 状态,然后中断所有没有正在运行的线程
  • 正在执行的线程和已经在队列中的线程并不会被中断,说白了就是使用shutDown 方法其实就是要等待所有任务正常全部结束以后才会关闭线程池
  • 调用 shutdown() 方法后如果还有新的任务被提交,线程池则会根据拒绝策略直接拒绝后续新提交的任务。

2.ShutDownNow

这个方法与上面方法相比较,直观就是 now ,即立即停止任务; 当执行shutDownNow 方法后,会像全部正在运行的队列通知中断,正在运行的线程接收到中断信号后选择处理,而在队列中的全部取消执行转移到一个list队列中返回。

3.awaitTermination

这个方法并不是用来关闭线程池的,首先我们看一下这个方法的定义: boolean awaitTermination_(long timeout, TimeUnit unit)
  • 可以看到这个方法有两个参数,timeout 表示等待的时间,unit 时间单位
  • 这个方法的作用是,调用后等待timeout时间后,反馈线程池的状态,等待期间(包括进入等待状态之前)线程池已关闭并且所有已提交的任务(包括正在执行的和队列中等待的)都执行完毕,相当于线程池已经“终结”了,方法便会返回 true;等待超时时间到后,第一种线程池“终结”的情况始终未发生,方法返回 false;等待期间线程被中断,方法会抛出 InterruptedException 异常。

4.isShutDown

isShutDown 方法正如名字,判断线程池是否停止,返回的是 Boolean 类型,如果已经开始停止线程池则返回 true 否则放回false。
当调用了shutDown 或shutDownNow 时之后,会返回 true 不过需要注意,这时候只是代表线程池关闭流程的开始,并不是说线程池已经停止了

5.isTerminated

这个方法与上面的方法的区别就是这是真正检测线程池是否真的终结了
  • 这不仅代表线程池已关闭,同时代表线程池中的所有任务都已经都执行完毕了,因为在调用 shutdown 方法之后,线程池会继续执行里面未完成的任务,包括正在执行的任务和在任务队列中等待的任务。
  • 如果调用了 shutdown 方法,但是有一个线程依然在执行任务,那么此时调用 isShutdown 方法返回的是 true,而调用 isTerminated方法返回的便是 false,因为线程池中还有任务正在在被执行,线程池并没有真正“终结”。
  • 直到所有任务都执行完毕了,调用 isTerminated() 方法才会返回 true,这表示线程池已关闭并且线程池内部是空的,所有剩余的任务都执行完毕了。

结尾

  • 感谢大家的耐心阅读,如有建议请私信或评论留言。
  • 如有收获,劳烦支持,关注、点赞、评论、收藏均可,博主会经常更新,与大家共同进步

你可能感兴趣的:(深入浅出多线程并发编程实战,多线程,java,并发编程,线程池,优雅关闭)