美文网首页
如何优雅地停止线程-interrupt()

如何优雅地停止线程-interrupt()

作者: NewNiu | 来源:发表于2023-02-18 11:05 被阅读0次

位于Thread类里面的interrupt()方法,它的作用就是中断线程。

从两个方面演示该方法。

1.停止正在运行的线程。
2.停止休眠中的线程

>step1.自定义一个任务,其中内容如下:
public class Task implement Runnable {
    @Override
    public void run() {
        While(true){
            System.out.println("正在运行。");
        }
    }
}
>step2.运行线程并执行interrupt方法
public static void main(String[] args) {
    Task task = new Task(); // 创建任务对象
    Thread thread = new Thread(task);  // 创建线程对象,并将任务传入线程
    thread.start();  // 启动线程
    Thread.sleep(1000); //让程序暂停1秒,可以看出效果
    thread.interrupt();// 停止线程。
}
>step3.查看运行结果。
      正在运行。
      正在运行。
      正在运行。
      正在运行。
      正在运行。
         .
     (一直打印)
         .
      正在运行。
>step4.这里发现了问题,执行结果却一直在打印!!为什么?
为什么一直打印?因为interrupt()只是仅仅将线程标记为中断状态,实际并没有去停止这个线程。如果想要线程停下来,则需要我们手动去判断线程是否被中断,然后对此做出反应。
方法名称 类型 作用
isInterrupted 非表态方法 判断线程是否被中断
interrupted 静态方法 判断线程是否被中断,并清除中断标记
/**
*  判断线程是否被中断
*  @return 线程被中断返回true,否则返回false
*/
public boolean isInterrupted()

>使用
public class Task implements Runnable{
    @Override
    public void run(){
          // 无限打印语句
          while(true){
              // 获取当前正在执行的线程
               Thread thread = Thread.currentThread().
               if(thread.isInterrupted()) {
                    break;// 结束循环
               }
              System.out.println("正在运行。");
          }
    }

}

下面来看一下interrupt()方法。

/**
*  判断线程是否被中断,并清除中断标记
*  @return 线程被中断返回true,否则返回false
*/
public boolean interrupted()

>使用
public class Task implements Runnable{
    @Override
    public void run(){
          // 无限打印语句
          while(true){
              // 当线程被中断时
              if(Thread.interrupted()) {
                   break;// 结束循环
              }
              System.out.println("正在运行。");
          }
    }
}

下面介绍下当使用interrupt方法中断正在休眠中的线程会导致什么样的结果。

public class Task implements Runnable{
    @Override
    public void run(){
         try{
            Thread.sleep(10000);// 让当前线程休眠10秒。
         }catch(Exception e){
            e.printStackTrace().
         }
    }
}
运行该线程
public static void main(String[] args){
    Task task = new Task();
    Thread thread = new Thread(task);
    thread.start();
    thread.interrupt();// 此时该线程正在休眠,突然调用interrupt()停止后,则会抛出异常,该异常是中断正在休眠中的线程引发的。
}
Exception:
    java.lang.InterruptedException:sleep interrupted
    at java.lang.Thread.sleep(Native Method)
    at main.Task.run(Task.java:11)
    ...

相关文章

网友评论

      本文标题:如何优雅地停止线程-interrupt()

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