Java结束线程的三种方法及该如何选择

 更新时间:2021年03月24日 08:44:19   作者:超人不会飞  
这篇文章主要介绍了Java结束线程的三种方法及该如何选择,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下

java常用的结束一个运行中的线程的方法有3中:使用退出标志,使用interrupt方法,使用stop方法。

1.使用退出标志

即在线程内部定义一个bool变量来判断是否结束当前的线程:

public class ThreadSafe extends Thread {
 public volatile boolean exit = false;
 public void run() {
  while (!exit){
   //do work
  }
 }

 public static void main(String[] args) throws Exception { 
  ThreadFlag thread = new ThreadFlag(); 
  thread.start(); 
  sleep(5000); // 主线程延迟5秒 
  thread.exit = true; // 终止线程thread 
  thread.join(); 
  System.out.println("线程退出!"); 
 }
}

这种情况一般是将线程的任务放在run方法中的一个while循环中,而由这个bool变量来对while循环进行控制。

2.使用interrupt方法

这种方法需要判断当前的线程所处于的状态:
(1)当前线程处于阻塞状态时
线程处于阻塞状态一般是在使用了 sleep,同步锁的 wait,socket 中的 receiver,accept 等方法时,会使线程处于阻塞状态。

public class ThreadInterrupt extends Thread { 
 public void run() { 
  try { 
   sleep(50000); // 延迟50秒 
  } 
  catch (InterruptedException e) { 
   System.out.println(e.getMessage()); 
  } 
 } 
 public static void main(String[] args) throws Exception { 
  Thread thread = new ThreadInterrupt(); 
  thread.start(); 
  System.out.println("在50秒之内按任意键中断线程!"); 
  System.in.read(); 
  thread.interrupt(); 
  thread.join(); 
  System.out.println("线程已经退出!"); 
 } 
}

注意这种情况写,使用 interrupt 方法结束线程的时候,一定要先捕获 InterruptedException 异常之后通过 break 来跳出循环,才能正常结束 run 方法。

(2)线程未处于阻塞状态时

使用 isInterrupted() 判断线程的中断标志来退出循环。当使用 interrupt() 方法时,中断标志就会置 true,和使用自定义的标志来控制循环是一样的道理。

public class ThreadSafe extends Thread {
 public void run() {
  while (!isInterrupted()) { //非阻塞过程中通过判断中断标志来退出
   try {
    Thread.sleep(5*1000); //阻塞过程捕获中断异常来退出
   } catch (InterruptedException e) {
    e.printStackTrace();
    break; //捕获到异常之后,执行 break 跳出循环
   }
  }
 }
}

3.使用stop方法来结束线程

public class Main {
 public static void main(String[] args) throws InterruptedException {
  MyThread myThread = new MyThread();
  myThread.start();
  Thread.sleep(3000); // 间隔3秒后
  myThread.stop();  // 结束线程
  System.out.println("结束了");
 }
}

4.结束方法的选择

建议使用标志位和interrupt方法来结束线程,stop方法已经不建议再被使用了。
因为采用 stop 是不安全的,主要影响点如下:

  1. thread.stop() 调用之后,创建子线程的线程就会抛出 ThreadDeatherror 的错误;
  2. 调用 stop 会释放子线程所持有的所有锁。导致了该线程所持有的所有锁的突然释放(不可控制),那么被保护数据就有可能呈现不一致性。

以上就是Java结束线程的三种方法及该如何选择的详细内容,更多关于Java 结束线程的资料请关注脚本之家其它相关文章!

相关文章

  • Java包装类原理与用法实例分析

    Java包装类原理与用法实例分析

    这篇文章主要介绍了Java包装类,结合实例形式分析了Java包装类基本概念、功能、原理、用法及操作注意事项,需要的朋友可以参考下
    2020-04-04
  • Jmeter实现Base64编码的两种方式

    Jmeter实现Base64编码的两种方式

    这篇文章主要介绍了Jmeter实现Base64编码,大家都知道Jmeter实现Base64编码有两种方式,本文通过图文并茂的形式把每种方法给大家介绍的非常详细,需要的朋友可以参考下
    2022-01-01
  • java多线程之Future和FutureTask使用实例

    java多线程之Future和FutureTask使用实例

    这篇文章主要介绍了java多线程之Future和FutureTask使用实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • SpringBoot2.动态@Value的实现方式

    SpringBoot2.动态@Value的实现方式

    这篇文章主要介绍了SpringBoot2.动态@Value的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Java如何比较两个任意文件是否相同

    Java如何比较两个任意文件是否相同

    这篇文章主要为大家详细介绍了Java如何实现比较两个任意文件是否相同,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-04-04
  • Java中对于双属性枚举的使用案例

    Java中对于双属性枚举的使用案例

    今天小编就为大家分享一篇关于Java中对于双属性枚举的使用案例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • 一文带你搞懂Java8的LocalDateTime

    一文带你搞懂Java8的LocalDateTime

    LocalDateTime 是Java8中新加入的日期时间类,现在都 Java20 了,不会还有人没用过 LocalDateTime 吧?今天给大家演示一下 LocalDateTime 的常用方法
    2023-04-04
  • spring boot的maven配置依赖详解

    spring boot的maven配置依赖详解

    本篇文章主要介绍了spring boot的maven配置依赖详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • 现代高效的java构建工具gradle的快速入门

    现代高效的java构建工具gradle的快速入门

    和Maven一样,Gradle只是提供了构建项目的一个框架,真正起作用的是Plugin,本文主要介绍了gradle入门,文中通过示例代码介绍的非常详细,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • 浅谈java中的TreeMap 排序与TreeSet 排序

    浅谈java中的TreeMap 排序与TreeSet 排序

    下面小编就为大家带来一篇浅谈java中的TreeMap 排序与TreeSet 排序。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12

最新评论