Java 简明教程
Java - Interrupting Thread
Interrupting a Thread in Java
线程可以通过调用线程对象的 interrupt 来发送中断信号给 JVM 以中断,这是为了中断线程。这意味着线程的中断是由任何其他调用 interrupt() 方法的线程引起的。
A thread can send an interrupt signal to JVM to interrupt by invoking interrupt on the Thread object for the thread to be interrupted. This means interruption of a thread is caused by any other thread calling the interrupt() method.
Methods for Interrupting a Thread
Thread class 提供了三种中断线程的方法 -
The Thread class provides three methods for interrupting a thread -
-
void interrupt() − Interrupts the thread.
-
static boolean interrupted() − Tests whether the current thread has been interrupted.
-
boolean isInterrupted() − Tests whether the thread has been interrupted.
Example of Interrupting a Java Thread
在此示例中,我们创建一个 Task 对象,它已实现 Runnable 接口以充当线程。使用 start() method,我们已启动该线程。作为下一条语句,我们使用 interrupt() 方法中断该线程,并在 run() method 中打印线程属性。
In this example, we’re creating a Task object which has implemented Runnable interface to act as a thread. Using start() method, we’ve started the thread. As next statement, we’re interrupting the thread using interrupt() method and we’re printing thread properties in run() method.
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(); // calling interrupt() method
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;
}
}
}
}
Example of Interrupting a Java Thread with InterruptedException Handling
在此示例中,我们正在处理中断并继续线程。我们正在创建一个已实现 Runnable 接口的任务对象作为线程。使用 start() 方法,我们已启动线程。作为下个语句,我们使用 interrupt() 方法中断线程,并在 run() 方法中处理 InterruptedException,并打印详细信息。
In this example, we’re handling the interruption and continuing the thread. We’re creating a Task object which has implemented Runnable interface to act as a thread. Using start() method, we’ve started the thread. As next statement, we’re interrupting the thread using interrupt() method and we’re handling InterruptedException in run() method and printing the details.
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(); // calling interrupt() method
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()");
}
}
}
}
Example of Checking Whether Thread is Interrupted or Not
在此示例中,我们展示了多个线程和 interrupted() 方法,以检查线程是否中断。我们正在创建多个已实现 Runnable 接口的任务对象作为线程。使用 start() 方法,我们已启动线程。然后,我们使用 interrupt() 方法中断线程,并使用 run() 方法中的 interrupted,我们正在打印详细信息。
In this example, we’re showcasing multiple threads and use of interrupted() method to check if a thread is interrupted or not. We’re creating multiple Task objects which has implemented Runnable interface to act as a thread. Using start() method, we’ve starting the threads. Then, we’re interrupting a thread using interrupt() method and using interrupted in run() method, we’re printing the details.
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(); // calling interrupt() method
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 ");
}
}
}