随笔 - 754  文章 - 0 评论 - 33 阅读 - 135万
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

结束线程有以下三种方法: (1)设置退出标志,使线程正常退出。 (2)使用interrupt()方法中断线程。 (3)使用stop方法强行终止线程(不推荐使用Thread.stop, 这种终止线程运行的方法已经被废弃,使用它们是极端不安全的!)

一、使用退出标志 

一般run()方法执行完,线程就会正常结束,然而,常常有些线程是伺服线程。它们需要长时间的运行,只有在外部某些条件满足的情况下,才能关闭这些线程。

使用一个变量来控制循环,例如:最直接的方法就是设一个boolean类型的标志,并通过设置这个标志为true或false来控制while循环是否退出,代码示例:

复制代码
public class Demo8Exit {
  public static boolean exit = true;
  public static void main(String[] args) throws InterruptedException {
    Thread t = new Thread(new Runnable() {
      public void run() {
        while (exit) {
          try {
            System.out.println("线程执行!");
            Thread.sleep(100l);
         } catch (InterruptedException e) {
            e.printStackTrace();
         }
       }
     }
   });
    t.start();
    Thread.sleep(1000l);
    exit = false;
    System.out.println("退出标识位设置成功");
 }
}
复制代码

结果如下:

复制代码
线程执行!
线程执行!
线程执行!
线程执行!
线程执行!
线程执行!
线程执行!
线程执行!
线程执行!
线程执行!
退出标识位设置成功
复制代码

二、使用interrupt()方法

使用interrupt()方法来中断线程有两种情况:

1、线程处于阻塞状态

如使用了sleep,同步锁的wait,socket中的receiver,accept等方法时,会使线程处于阻塞状态。当调用线程的interrupt()方法时,会抛出InterruptException异常。阻塞中的那个方法抛出这个异常,通过代码捕获该异常,然后break跳出循环状态,从而让我们有机会结束这个线程的执行。

2、线程未处于阻塞状态

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

复制代码
public class Demo9Interrupt {
  public static boolean exit = true;
  public static void main(String[] args) throws InterruptedException {
    Thread t = new Thread(new Runnable() {
      public void run() {
        while (exit) {
          try {
            System.out.println("线程执行!");
            //判断线程的中断标志来退出循环
            if (Thread.currentThread().isInterrupted()) {
              break;
           }
            Thread.sleep(100l); 
         } catch (InterruptedException e) {
            e.printStackTrace();
            //线程处于阻塞状态,当调用线程的interrupt()方法时,
            //会抛出InterruptException异常,跳出循环
            break;
         }
       }
     }
   });
    t.start();
    Thread.sleep(200l);
    //中断线程
    t.interrupt();
    System.out.println("线程中断了");
 }
}
复制代码

其中一次运行结果如下:

线程执行!
线程执行!
线程执行!
线程中断了

此时线程未处于阻塞状态。

其中一次运行结果如下:

线程执行!
线程执行!
线程中断了
java.lang.InterruptedException: sleep interrupted
    at java.base/java.lang.Thread.sleep(Native Method)
    at com.zwh.Demo9Interrupt$1.run(Demo9Interrupt.java:20)
    at java.base/java.lang.Thread.run(Thread.java:844)

此时线程处于阻塞状态。



感谢您的阅读,如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮。本文欢迎各位转载,但是转载文章之后必须在文章页面中给出作者和原文连接
posted on   周文豪  阅读(206)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2021-02-07 Mysql训练:第二高的薪水(IFNULL,OFFSET,LIMIT)
点击右上角即可分享
微信分享提示