Java线程中断是一种比较常用的多线程技术,它可以在不影响其他线程的情况下,对某个特定的线程进行中断。Java中断机制可以让一个正在运行的线程停止,而不会影响其他正在运行的线程。
Java中断机制是通过Thread.interrupt()方法来实现的,该方法会将目标Thread对象的中断标志位设为true,并不会立即停止该Thread对象。只有当该Thread对象执行到一些可以检测到中断标志位时(如sleep、wait、join方法)才会真正停止。
public class InterruptTest { public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(new Runnable() { @Override public void run() { while (true) { if (Thread.currentThread().isInterrupted()) { System.out.println("Interrupted!"); break; } try { Thread.sleep(2000); } catch (InterruptedException e) { System.out.println("Interrupted When Sleep"); Thread.currentThread().interrupt(); // 再次设定中断标志位 } Thread.yield(); // 礼让 } } }); t1.start(); Thread.sleep(2000); t1.interrupt(); // 设定中断标志位 } }
我们可以通过使用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()); } }
上面的代码生成以下结果。
下面的代码如何一个线程将中断另一个线程。
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); } }
上面的代码生成以下结果。
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()); } }
上面的代码生成以下结果。
你可以中断一个被阻塞的线程。
如果在这三种方法上阻塞的线程被中断,则抛出一个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!");
}
}
}
}
上面的代码生成以下结果。
Java数据类型教程 -Java float数据类型浮点数据类型当评估需要分数精度的表达式时,使用浮点数(也称为实数)。包含小数部分的数...
Java教程 -Java If语句Java if语句用于根据条件执行一个代码块。Java If语句下面是Java if语句的最简单形式:if(condition)statem...
Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本。 Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程...
计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量。我们可以把运算符分成...
有一个问题困扰着许多初学java的新手们,那就是有必要去学习数据结构吗?虽然你可能没有特意去看一些数据结构的专业书籍,你仍然...