Java 线程中断

Java线程教程 – Java线程中断

我们可以通过使用interrupt()方法中断一个活动的线程。

这个方法调用在线程只是一个指示。它是由线程如何响应中断。

例子

下面的代码显示了中断主线程并打印线程中断状态的代码。

public class Main {
  public static void main(String[] args) {
    System.out.println("#1:" + Thread.interrupted());

    // Now interrupt the main thread
    Thread.currentThread().interrupt();

    // Check if it has been interrupted
    System.out.println("#2:" + Thread.interrupted());

    // Check again if it has been interrupted
    System.out.println("#3:" + Thread.interrupted());
  }
}

上面的代码生成以下结果。

例2

下面的代码如何一个线程将中断另一个线程。

public class Main {
  public static void main(String[] args) {
    Thread t = new Thread(Main::run);
    t.start();
    try {
      Thread.currentThread().sleep(1000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    t.interrupt();
  }

  public static void run() {
    int counter = 0;
    while (!Thread.interrupted()) {
      counter++;
    }
    System.out.println("Counter:" + counter);
  }
}

上面的代码生成以下结果。


例3

Thread类有一个非静态的isInterrupted()方法,可以用来测试一个线程是否被中断。

public class Main {
  public static void main(String[] args) {
    System.out.println("#1:" + Thread.interrupted());

    Thread mainThread = Thread.currentThread();
    mainThread.interrupt();

    System.out.println("#2:" + mainThread.isInterrupted());

    System.out.println("#3:" + mainThread.isInterrupted());

    System.out.println("#4:" + Thread.interrupted());

    System.out.println("#5:" + mainThread.isInterrupted());
  }
}

上面的代码生成以下结果。

例4

你可以中断一个被阻塞的线程。

如果在这三种方法上阻塞的线程被中断,则抛出一个InterruptedException,并清除线程的中断状态。

以下代码启动一个休眠一秒的线程,并打印一条消息,直到它被中断。

public class Main {
  public static void main(String[] args) throws InterruptedException{
    Thread t = new Thread(Main::run);
    t.start();
    Thread.sleep(5000);
    t.interrupt();
  }

  public static void run() {
    int counter = 1;
    while (true) {
      try {
        Thread.sleep(1000);
        System.out.println("Counter:" + counter++);
      } catch (InterruptedException e) {
        System.out.println("I got  interrupted!");
      }
    }
  }
}

尝试一下

上面的代码生成以下结果。

版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
文章名称:《Java 线程中断》
文章链接:https://zhuji.vsping.com/295272.html
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。