线程的生命周期管理API中,没有抢占式的关闭方式。早期,jdk有stop方法可以直接中断线程的运行。但是这种方式,对程序来说并不友好。哪里不友好呢?oralce的官网上,给了详细的说明
为什么stop方法过时了?
简单翻译一下:其实,最主要的原因就是:一旦对某一个线程执行了stop方法,该线程会释放其持有的所有的锁。一旦锁被释放,被这些锁保护的对象,就会对其它线程可见,并可以对该对象进行并发操作,进而会引发线程安全问题。
java没有提供抢占式关闭,但是提供了协作式的方法。把处理中断的权利交给了程序员,更人性化。
thread.interrupt。
该方法执行后,产生的影响有几种情况:
1).线程正在运行,线程中有响应中断的方法
比如:Thread.sleep和Object.wait以及阻塞队列的put,take等方法,都会响应中断(抛出InterruptedException的方法)
此时,执行了interrupt方法后,阻塞方法会检测到中断信号,并抛出InterruptedException。并且清除中断的状态。对于这种情况来说,我们一定不能只是捕捉异常,一定要处理这个异常。
将异常抛给调用者。
或者恢复中断的标志,Thread.currentThread.interrupt()。让上层代码知道该线程发生了中断。
2).线程正在运行,线程中没有响应中断的方法。
此时,中断线程。线程自己知道已经被中断了,但是由于没有响应中断的方法。所以此时,线程会带着这个标识运行,继续执行剩余的代码,没有什么影响。此时,我们可以通过线程的isInterrupted方法检测到线程被中断。进而进行线程的退出或者其他操作
总结一句话就是:
线程的中断操作,不会直接关闭一个线程,只是发出了关闭的请求。目标线程收到中断请求后。具体怎样处理这个中断,由目标线程自己处理。所以,每一个线程需要有自己的中断策略
interrupt能关闭一个线程吗?
最新推荐文章于 2023-10-16 16:40:12 发布