JAVA线程终止&JVM退出

一. 如何终止线程

  1. 线程run运行完毕,线程自动终止

  2. 在while循环条件中设置 标志位

public class ThreadFlag extends Thread { 

    public volatile boolean exit = false; 

    public void exit(){
      this.exit = true;
    }

    public void run(){ 
        while (!exit); 
    } 

    public static void main(String[] args) throws Exception  { 
    
        ThreadFlag thread = new ThreadFlag(); 

        thread.start(); 

        sleep(3000); // 主线程延迟3秒 

        thread.exit();  // 终止线程thread 

        thread.join(); 

        System.out.println("线程退出!"); 

    } 

}
  1. 使用interrupt()方法(推荐)
public class ThreadFlag extends Thread { 

    public volatile boolean exit = false; 

    public void exit(){
      this.exit = true;
    }

    public void run(){ 
    
        while (!Thread.currentThread.isInterrupted()){
      try {
            System.out.println("线程开始。");       
            Thread.sleep(200000);
            System.out.println("线程结束。");
        } catch (InterruptedException e) {
            System.out.println("遇到sleep,进入catch异常");
            e.printStackTrace();
            // 方法1.阻塞时退出方法
            // break;
            //方法2. 或者重新标记线程状态为中断,因为catch 打印异常会将中断设置为默认的false   
            Thread.currentThread.interrupt();
        }
       }
    } 

    public static void main(String[] args) throws Exception  { 
    
        ThreadFlag thread = new ThreadFlag(); 

        thread.start(); 

        sleep(3000); // 主线程延迟3秒 

        thread.interrupt();  // 终止线程thread 

        thread.join(); 

        System.out.println("线程退出!"); 

    } 

}

二. JVM关闭的几种情况

说明:JAVA线程不独立进程,因此JVM退出时,所有的线程都会关闭,程序宕机时也是如此。

正常关闭
  1. 所有非daemon线程退出
  2. 调用System.exit() 
     (IDEA点击终止程序按钮也属于这种情况)
  4. SIGINT(ctrl+c)
  5. SIGTERM(kill -15)

异常关闭
  1. 未捕获的异常
  2. oom

强制关闭
  1. SIGKILL(kill -9)
  2. 应用crash
  3. 机器宕机

补充:守护线程与非守护线程

守护线程设置要在线程启动前
thread.setDaemon(true); 
thread.start();

参考:
JAVA中如何正确的停止线程
JVM关闭及线程的退出
JVM优雅退出

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JackHuan_code

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值