353 字
2 分钟
怎么安全停止一个线程任务?原理是什么?线程池里有类似机制吗?

怎么安全停止一个线程任务?原理是什么?线程池里有类似机制吗?#

终止线程#

1、使用violate boolean变量退出标志,使线程正常退出,也就是当run方法完成后线程终止。(推荐)

2、使用interrupt()方法中断线程,但是线程不一定会终止。

3、使用stop方法强行终止线程。不安全主要是:thread.stop()调用之后,创建子线程的线程就会抛出ThreadDeatherror的错误,并且会释放子线程所持有的所有锁。

终止线程池#

ExecutorService线程池就提供了shutdown和shutdownNow这样的生命周期方法来关闭线程池自身以及它拥有的所有线程。

  1. shutdown关闭线程池

线程池不会立刻退出,直到添加到线程池中的任务都已经处理完成,才会退出。

  1. shutdownNow关闭线程池并中断任务

终止等待执行的线程,并返回它们的列表。试图停止所有正在执行的线程,试图终止的方法是调用Thread.interrupt(),但是大家知道,如果线程中没有sleep 、wait、Condition、定时锁等应用, interrupt()方法是无法中断当前的线程的。所以,ShutdownNow()并不代表线程池就一定立即就能退出,它可能必须要等待所有正在执行的任务都执行完成了才能退出。

怎么安全停止一个线程任务?原理是什么?线程池里有类似机制吗?
作者
强人自传
发布于
2022-11-18
许可协议
CC BY-NC-SA 4.0