JAVA中断线程的方法


Thread.stop, Thread.suspend, Thread.resume 和Runtime.runFinalizersOnExit 这些终止线程运行的方法已经被废弃,使用它们是极端不安全的!
 
现在,如果你要安全有效地终止一个线程,应该采用以下这些方法:
 

1,线程正常执行完毕,正常结束。


也就是让run方法执行完毕,该线程就会正常结束。
 

2,监视某些条件,结束线程的不间断运行。


然而,常常有些线程是伺服线程。它们需要长时间的运行,只有在外部某些条件满足的情况下,才能关闭这些线程。
通常,它们执行在一个while(true)的死循环中。
如:
@Override
    publicvoid run() {
      
       while(true){
           someWork();
           if(finished){
              break;
           }
           try {
              Thread.sleep(10000);
           } catch (InterruptedException e) {
             
              e.printStackTrace();
           }
       }
 
   }
我们可以在while死循环内,每次循环时,察看外部条件,看看是否需要关闭当前线程。如果是,就break,跳出死循环,或者是抛出异常,跳出死循环,结束线程。
 

3,捕获InterruptedException 运行时异常,中断当前线程。


有些执行伺服任务的线程,在while(true)这样的死循环内部,是一个阻塞中的方法。此时,就不能采用第二种方法了。因为,当该方法没有返回时,该线程一直处于阻塞当中,根本无法执行其他语句。
此时,就需要调用该线程的interrupt方法,产生一个InterruptedException运行时异常,是阻塞中的那个方法抛出这个异常,从而让我们有机会结束这个线程的执行。
如:
@Override
    publicvoid run() {
while(true){
           try {
// getSendMessages 是BlockingQueue类。它的take方法将会阻塞!
              responseMessage = this.getSendMessages().take();
           } catch (InterruptedException e1) {
   
              thrownew RuntimeException();
//或者break;
           }
           someWork();
      
    }
 
 
    一个外部的Thread 对象 指向这个线程。 需要结束这个线程时,只需要调用thread对象的interrupt() 方法,就会在
responseMessage = this.getSendMessages().take();
这条语句中产生一个InterruptedException异常,从而结束该线程的阻塞状态,通过抛出异常,或者break跳出死循环,结束这个线程。
————————————————————————————————————————————————————————————————
java线程退出实现方式

http://blog.csdn.net/jiaby008/article/details/6198739

使用Thread.interrupt()中断线程

正如Listing A中所描述的,Thread.interrupt()方法不会中断一个正在运行的线程。这一方法实际上完成的是,在线程受到阻塞时抛出一个中断信号,这样线程就得以退出阻塞的状态。更确切的说,如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞,那么,它将接收到一个中断异常(InterruptedException),从而提早地终结被阻塞状态。

因此,如果线程被上述几种方法阻塞,正确的停止线程方式是设置共享变量,并调用interrupt()(注意变量应该先设置)。如果线程没有被阻塞,这时调用interrupt()将不起作用;否则,线程就将得到异常(该线程必须事先预备好处理此状况),接着逃离阻塞状态。在任何一种情况中,最后线程都将检查共享变量然后再停止。

JAVA中断线程的方法相关推荐

  1. java中断线程_Java中断线程的方法

    使用interrupt()中断线程 当一个线程运行时,另一个线程可以调用对应的Thread对象的interrupt()方法来中断它,该方法只是在目标线程中设置一个标志,表示它已经被中断,并立即返回.这 ...

  2. java中断线程_Java线程中断机制-如何中断线程

    介绍: 对于线程一共分为五个状态:新建状态,就绪状态,阻塞状态,运行状态,死亡状态,有时候把阻塞状态又分为同步阻塞和等待阻塞. 有时想让主线程启动的一个子线程结束运行,我们就需要让这个子线程中断,不再 ...

  3. 关于java中线程yield()方法问题

    关于java中线程yield()方法问题 问题一: 我知道yield是用来休眠当前线程,但我查看了资料,又说其不会释放锁,所以我就不解了,其明明会将cpu资源给其他线程,那它不释放锁,其他线程有怎么获 ...

  4. c++并发编程实战_Java 并发编程实战:JAVA中断线程几种基本方法

    一个多线程Java程序,只有当其全部线程执行结束时(更具体地说,是所有非守护线程结束或者某个线程调用system.exit()方法的时候) ,才会结束运行.有时,为了终止程序或者取消一个线程对象所执行 ...

  5. java 中断线程 wait_Java 线程中断(interrupt)与阻塞 (park)的区别

    很多Java开发人员(包括我),尤其是刚进入软件行业的新手,认为Java设置线程中断就是表示线程停止了,不往前执行了, Thread.currentThread().interrupt() 其实不是这 ...

  6. Thread中断线程的方法

    线程对象属于一次性消耗品,一般线程执行完run方法之后,线程就正常结束了,线程结束之后就报废了,不能再次start,只能新建一个线程对象.但有时run方法是永远不会结束的.例如在程序中使用线程进行So ...

  7. java开启线程的方法_Java有几种方法开启线程?怎么实现带有返回值的线程?

    Java有几种方法开启线程?怎么实现带有返回值的线程? 发布时间:2020-05-22 11:20:08 来源:亿速云 阅读:238 作者:Leah Java有几种方法开启线程?怎么实现带有返回值的线 ...

  8. java暂停线程的方法_Java修炼——暂停线程的四个方法

    线程的获取方法:Thread.currentThread()后面可以加上获取线程的名字.getName()这样就成功获取到了线程的名字. Sleep会导致当前线程休眠一定时间,进入阻塞状态 Join会 ...

  9. java线程interrupt用法_Java 如何中断线程

    本篇文章帮大家学习java 如何中断线程,包含了Java 如何中断线程使用方法.操作技巧.实例演示和注意事项,有一定的学习价值,大家可以用来参考. 以下实例演示了如何使用interrupt()方法来中 ...

最新文章

  1. [BZOJ2527]Meteors
  2. centos 一键安装ftp 配置_CentOS快速搭建FTP(初级-四步)
  3. IBM中国开发中心吉燕勇: 通过Cloud Data Services打造新型认知计算数据分析云平台...
  4. 浅谈Spring5 响应式编程
  5. php里h和h的区别吗,编码h264h和h264b有什么区别
  6. QT5 QSqlQuery的SELECT INSERT UPDATE DELETE命令用法
  7. python dag调度系统开发_基于DAG的分布式任务调度平台-Maat
  8. 华为鸿蒙OS发布!余承东:如果安卓不可用,随时启用鸿蒙
  9. Linux下文件的打包、解压缩指令——tar,gzip,bzip2,unzip,rar
  10. 『中级篇』Docker-Stack部署wordpress(49)
  11. “熊猫烧香”病毒的原理
  12. 下载docker镜像包
  13. ASP敏感词汇过滤函数
  14. IDA pdb 自动下载
  15. 以管理员身份进入linux,ubuntu 以管理员身份运行程序
  16. 三角形花园和向左走(三角形性质和点集排序)
  17. LCD 触摸屏调试记录
  18. QOS中 PQ,CQ.RR,WFQ,CBWFQ,LLQ区分
  19. 阿里组织新调整:张勇兼任云业务总裁“敏捷组织”是内核
  20. 全景视频拍摄怎么拍摄?全景视频用什么软件制作?

热门文章

  1. java 异常练习题_java入门异常处理练习题问题
  2. 电力、市政、交通三大领域推动工业交换机行业发展
  3. 光纤收发器常见六大故障,三分钟全部搞定
  4. 电话光端机与PCM复用设备的区别
  5. 【渝粤教育】国家开放大学2018年春季 0273-22T中国现代文学 参考试题
  6. linux手机摩托,Linux操作系统触控智能机 摩托ZN4图赏
  7. node mysql安装目录_nodejs 指定全局安装路径和缓存路径
  8. 将matlab中数据输出保存为txt或dat格式
  9. nginx 电子书_Nginx最详细的反向代理配置步骤,拿去不谢
  10. sqlserver select 数值精度_SQL Server读懂语句运行 (二) SET STATISTICS IO ON