美文网首页
如何优雅地停止线程-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