美文网首页
如何正确的停止一个线程?

如何正确的停止一个线程?

作者: Hoker_ | 来源:发表于2018-11-15 17:15 被阅读0次
实际项目中,有时候需要中断另外一个线程,早期可以使用stop()方法,但由于stop强制停止的特性(立刻释放所有monitors),可能会导致一系列难以处理的问题,故最新java版本stop方法已不可用,这里简单介绍下关于其替代方法interrupt()的使用。

如图:stop方法已无法再用,会直接抛出异常


stop被禁用

那么,interrupt()方法该怎么用呢?interrupt()其本身并不是一个强制打断线程的方法,其仅仅会修改线程的interrupt标志位,然后让线程自行去读标志位,自行判断是否需要中断。

先看第一个例子:

  1. 线程t1依次打印0到1000000
  2. 线程t2在等待1秒后,触发线程的t1.interrupt();
仅调用interrupt()

结合前面的说明,可以先想一下log输出是什么?


调用结果

自然地,t1.interrupt()并没有起到效果,t1线程照样还是打印完了0~1000000
按前文所说,是否需要真正中断,需要让当事线程自行处理,如图:


自行处理
如果线程t1发现自己被要求中断了,则直接退出run()方法,结果如下:
自行处理结果

一般的,我们会在执行耗时操作前去做isInterrupted()的判断,比如说IO、网络之类的,避免多余的操作。

其实到这里,也顺便说明的下对象里的wait()和线程里的sleep()方法,为什么总是和InterruptedException扯到一起?在设计里,如果线程处于休眠状态,那一旦其被调用interrupt()方法,则就没有必要继续休眠下去了,直接抛出异常InterruptedException,让被打断线程去做收尾操作,及时释放线程资源。

如图示例:

image.png

总结:interrupt()是一个“很软”的操作,也就是提醒线程应该结束了,至于如何结束,什么时候结束,以及是否需要结束,都是由线程自行处理。所以,interrupt()的使用,会让开发做更多的事,但这是有必要的,因为只有线程自己,才知道如何合适的结束自己。

相关文章

  • 一个简单的带中断策略的Thread用例

    使用: 如何优雅的"停止"一个正在运行的JAVA线程如何正确地停止一个线程?关闭线程的正确方法:“优雅”的中断Ja...

  • Java中如何正确停止线程?两种停止线程最佳方法

    如何正确停止线程 使用 interrupt 来通知,而不是强制 1:普通情况停止线程 通知停止线程thread.i...

  • 如何停止线程

    前言 线程的使用想必大家都很熟悉,那么关于如何停止一个线程,或者说如何正确的停止一个线程,尤其是在涉及到锁、多个线...

  • 如何正确中断线程?

    在线程运行的过程中 如何正确的停止线程? 是否可以使用volatile来停止线程? 使用Interrupt 对于j...

  • Java多线程:如何停止/中断一个运行中的线程?

    # 面试题: 如何正确地停止/中断一个线程 哪些情况下线程会停止 如何处理不可中断的阻塞 # 核心思想 使用int...

  • Java线程系列——线程的停止

    一、如何正确的停止线程 线程的停止有两种情况,一种是程序运行完毕,线程自然停止;而另一种是用户主动取消。Java语...

  • JAVA终止线程的方法

    如何正确地停止一个线程 方法如下: 使用退出标志,使线程正常退出,也就是当 run 方法完成后线程终止 使用 in...

  • 如何正确的停止一个线程

    停止一个线程意味着在任务处理完任务之前停掉正在做的操作,也就是放弃当前的操作。停止一个线程可以用Thread.st...

  • 如何正确的停止一个线程?

    实际项目中,有时候需要中断另外一个线程,早期可以使用stop()方法,但由于stop强制停止的特性(立刻释放所有m...

  • Java循环线程

    正确的线程循环写法: 用一个boolean变量或者 线程的Interrupted标志位来判断。 停止线程时,调用,...

网友评论

      本文标题:如何正确的停止一个线程?

      本文链接:https://www.haomeiwen.com/subject/dnpyfqtx.html