线程可以通过调用要中断的线程对象上的 interrupt
方法向 JVM 发送中断信号来中断。这意味着线程的中断是由其他线程调用 interrupt()
方法引起的。
用于中断线程的方法
Thread
类提供了三种方法来中断一个线程:
-
void interrupt()
—— 中断线程。
-
static boolean interrupted()
—— 测试当前线程是否已被中断。
-
boolean isInterrupted()
—— 测试线程是否已被中断。
示例:中断 Java 线程
在此示例中,我们创建了一个实现了 Runnable
接口的 Task
对象,充当线程。使用 start()
方法启动了线程。接下来,我们使用 interrupt()
方法中断线程,并在 run()
方法中打印线程属性。
示例代码
package com.tutorialspoint;
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();
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("This thread was interruped by someone calling this Thread.interrupt()");
System.out.println("Cancelling task running in thread " + Thread.currentThread().getName());
System.out.println("After Thread.interrupted() call, JVM reset the interrupted value to: " + Thread.interrupted());
break;
}
}
}
}
输出
Thread main started
Main Thread finished
[Thread-0] Message 0
This thread was interruped by someone calling this Thread.interrupt()
Cancelling task running in thread Thread-0
After Thread.interrupted() call, JVM reset the interrupted value to: false
示例:处理 InterruptedException 的 Java 线程中断
在此示例中,我们处理了中断并继续执行线程。我们创建了一个实现了 Runnable
接口的 Task
对象充当线程。使用 start()
方法启动了线程。接下来,我们使用 interrupt()
方法中断线程,并在 run()
方法中处理 InterruptedException
并打印详细信息。
示例代码
package com.tutorialspoint;
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();
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("This thread was interruped by someone calling this Thread.interrupt()");
}
}
}
}
输出
Thread main started
Main Thread finished
[Thread-0] Message 0
This thread was interruped by someone calling this 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.tutorialspoint;
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();
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