ExecutorService中shutdown、shutdownNow、awaitTermination含义

使用ExecutorService类时,经常用到 shutdown()shutdownNow()awaitTermination() 3个方法,下面我们来说说它们的含义和三者的区别。

shutdown():停止接收新任务,原来的任务继续执行

1、停止接收新的submit、execute的任务
2、已经提交的任务(包括正在执行的和队列中等待的),会继续执行完成
3、等到第2步完成后,才真正停止

shutdownNow():停止接收新任务,原来的任务停止执行

1、跟 shutdown() 一样,先停止接收新submit的任务

2、忽略队列里等待的任务

3、尝试将正在执行的任务interrupt中断

4、返回未执行的任务列表

说明:它试图终止线程的方法是通过调用 Thread.interrupt() 方法来实现的,这种方法的作用有限,如果线程中没有sleep 、wait、Condition、定时锁等应用, interrupt() 方法是无法中断当前的线程的。所以,shutdownNow() 并不代表线程池就一定立即就能退出,它也可能必须要等待所有正在执行的任务都执行完成了才能退出。但是大多数时候是能立即退出的。

awaitTermination(long timeOut, TimeUnit unit):当前线程阻塞

当前线程阻塞,直到:

  • 等所有已提交的任务(包括正在跑的和队列中等待的)执行完
  • 或者 等超时时间到了(timeout 和 TimeUnit设定的时间)
  • 或者 线程被中断,抛出InterruptedException

然后会监测 ExecutorService 是否已经关闭,如果已经关闭则返回true(shutdown请求后所有任务执行完毕)或false(已超时)。awaitTermination一般配合shutdown一起使用,并且先调用shutdown然后再调用awaitTermination。

发布了81 篇原创文章 · 获赞 4 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/GracefulGuigui/article/details/104023401