Java - 中断线程
Java 中的线程中断
线程可以通过在要中断的线程的 Thread 对象上调用 interrupt() 方法,向 JVM 发送中断信号来实现中断。这意味着线程的中断是由其他线程调用 interrupt() 方法引起的。
中断线程的方法
Thread 类提供了三个用于中断线程的方法 -
void interrupt() − 中断线程。
static boolean interrupted() − 测试当前线程是否已被中断。
boolean isInterrupted() − 测试线程是否已被中断。
中断 Java 线程的示例
在这个示例中,我们创建了一个实现了 Runnable 接口的 Task 对象,用作线程。通过 start() 方法启动线程。接下来,我们使用 interrupt() 方法中断线程,并在 run() 方法中打印线程属性。
package com.;
public class TestThread {
public static void main(String[] args) {
System.out.println("Thread main started");
final Task task = new Task();
final Thread thread = new Thread(task);
thread.start();
thread.interrupt(); // 调用 interrupt() 方法
System.out.println("Main Thread finished");
}
}
class Task implements Runnable {
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println("[" + Thread.currentThread().getName() + "] Message " + i);
if(Thread.interrupted()) {
System.out.println("这个线程被某人调用 Thread.interrupt() 中断了");
System.out.println("取消线程 " + Thread.currentThread().getName() + " 中运行的任务");
System.out.println("调用 Thread.interrupted() 后,JVM 将中断状态重置为: " + Thread.interrupted());
break;
}
}
}
}
输出
Thread main started Main Thread finished [Thread-0] Message 0 这个线程被某人调用 Thread.interrupt() 中断了 取消线程 Thread-0 中运行的任务 调用 Thread.interrupted() 后,JVM 将中断状态重置为: false
处理 InterruptedException 的 Java 线程中断示例
在这个示例中,我们处理中断并继续线程执行。我们创建了一个实现了 Runnable 接口的 Task 对象,用作线程。通过 start() 方法启动线程。接下来,我们使用 interrupt() 方法中断线程,并在 run() 方法中处理 InterruptedException 并打印详细信息。
package com.;
public class TestThread {
public static void main(String[] args) {
System.out.println("Thread main started");
final Task task = new Task();
final Thread thread = new Thread(task);
thread.start();
thread.interrupt(); // 调用 interrupt() 方法
System.out.println("Main Thread finished");
}
}
class Task implements Runnable {
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println("[" + Thread.currentThread().getName() + "] Message " + i);
try {
Thread.sleep(50);
} catch (InterruptedException e) {
System.out.println("这个线程被某人调用 Thread.interrupt() 中断了");
}
}
}
}
输出
Thread main started Main Thread finished [Thread-0] Message 0 这个线程被某人调用 Thread.interrupt() 中断了 [Thread-0] Message 1 [Thread-0] Message 2 [Thread-0] Message 3 [Thread-0] Message 4
检查线程是否被中断的示例
在这个示例中,我们展示了多个线程以及使用 interrupted() 方法来检查线程是否被中断。我们创建了多个实现了 Runnable 接口的 Task 对象来充当线程。使用 start() 方法启动这些线程。然后,我们使用 interrupt() 方法中断一个线程,并在 run() 方法中使用 interrupted 来打印详细信息。
package com.;
public class TestThread {
public static void main(String[] args) {
System.out.println("Thread main started");
final Task task1 = new Task();
final Thread thread1 = new Thread(task1);
final Task task2 = new Task();
final Thread thread2 = new Thread(task2);
final Task task3 = new Task();
final Thread thread3 = new Thread(task3);
thread1.start();
thread2.start();
thread3.start();
thread1.interrupt(); // 调用 interrupt() 方法
System.out.println("Main Thread finished");
}
}
class Task implements Runnable {
@Override
public void run() {
if(Thread.interrupted()) {
System.out.println("[" + Thread.currentThread().getName() + "] Interrupted ");
}else {
System.out.println("[" + Thread.currentThread().getName() + "] Uninterrupted ");
}
}
}
输出
Thread main started Main Thread finished [Thread-2] Uninterrupted [Thread-0] Interrupted [Thread-1] Uninterrupted