可以通过调用线程池的shutdown或shutdownNow方法来关闭线程池。
一、 shutdown() 将线程池状态置为shutdown,并不会立即停止:
-
停止接收外部submit的任务
-
内部正在跑的任务和队列里等待的任务,会执行完
-
等到第二步完成后,才真正停止
当线程池调用shutdown()方法时,线程池的状态则马上变成SHUTDOWN
状态,这时候不能再往线程池中添加任何任务,否则将会抛出RejectedExecutionException
异常,但是此时线程池不会立即退出,直到线程池中的任务都已经处理完成,才会退出。
二、shutdownNow() 将线程池状态置为stop。一般会立即停止,事实上不一定:
-
和shutdown()一样,先停止接收外部提交的任务
-
忽略队列里等待的任务
-
尝试将正在跑的任务interrupt中断
-
返回未执行的任务列表
shutdown 和shutdownnow简单来说区别如下:
shutdownNow()能立即停止线程池,正在跑的和正在等待的任务都停下了。这样做立即生效,但是风险也比较大。
shutdown()只是关闭了提交通道,用submit()是无效的;而内部的任务该怎么跑还是怎么跑,跑完再彻底停止线程池。