Java中停止线程的原则是什么?
在 Java 中, 最好的停止线程的方式是使用中断 interrupt, 但是这仅仅是会通知到被终止的线程 "你该停止运行了", 被终止的线程自身拥有决定权 (决定是否、以及何时停止), 这依赖于请求停止方和被停止方都遵守一种约定好的编码规范.
处理中断的最好方法是什么?
优先选择在方法上抛出异常.
用 throws InterruptedException 标记你的方法, 不采用 try 语句块捕获异常,以便于该异常可以传递到顶层, 让run方法可以捕获这一异常, 例如:
void subTask() throws InterruptedException sleep(delay); }
由于 run 方法内无法抛出 checked Exception (只能用 try catch), 顶层方法必须处理该异常, 避免了漏掉或者被吞掉的情况, 增强了代码的健壮性.
如果不能抛出中断, 要怎么做?
如果不想或无法传递 InterruptedException (例如用 run 方法的时候, 就不让该方法 throws InterruptedException), 那么应该选择在 catch 子句中调用 Thread.currentThread().interrupt() 来恢复设置中断状态, 以便于在后续的执行依然能够检查到刚才发生了中断.
代码演示详见视频, 在这里, 线程在sleep期间被中断, 并且由 catch 捕获到该中断, 并重新设置了中断状态, 以便于可以在下一个循环的时候检测到中断状态, 正常退出.
为什么用 volatile 停止线程不够全面?
解答: 这种做法是错误的, 或者说是不够全面的, 在某些情况下虽然可用, 但是某些情况下有严重问题。
这种方法在《Java并发编程实战》中被明确指出了缺陷, 我们一起来看看缺陷在哪里:
此方法错误的原因在于, 如果我们遇到了线程长时间阻塞 (这是一种很常见的情况, 例如生产者消费者模式中就存在这样的情况), 就没办法及时唤醒它, 或者永远都无法唤醒该线程, 而 interrupt 设计之初就是把 wait 等长期阻塞作为一种特殊情况考虑在内了, 我们应该用 interrupt 思维来停止线程.
以上就是Java 停止线程需要注意的地方的详细内容,更多关于Java 停止线程的资料请关注菜鸟教程(cainiaojc.com)其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:notice#cainiaojc.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。