Java 简明教程

Java - Interrupting Thread

Interrupting a Thread in Java

线程可以通过调用线程对象的 interrupt 来发送中断信号给 JVM 以中断,这是为了中断线程。这意味着线程的中断是由任何其他调用 interrupt() 方法的线程引起的。

Methods for Interrupting a Thread

Thread class 提供了三种中断线程的方法 -

  1. void interrupt() − 中断线程。

  2. static boolean interrupted() - 测试当前线程是否已被中断。

  3. boolean isInterrupted() - 测试该线程是否已被中断。

Example of Interrupting a Java Thread

在此示例中,我们创建一个 Task 对象,它已实现 Runnable 接口以充当线程。使用 start() method,我们已启动该线程。作为下一条语句,我们使用 interrupt() 方法中断该线程,并在 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;
         }
      }
   }
}

Output

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

Example of Interrupting a Java Thread with InterruptedException Handling

在此示例中,我们正在处理中断并继续线程。我们正在创建一个已实现 Runnable 接口的任务对象作为线程。使用 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(); // 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()");
		}
      }
   }
}

Output

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

Example of Checking Whether Thread is Interrupted or Not

在此示例中,我们展示了多个线程和 interrupted() 方法,以检查线程是否中断。我们正在创建多个已实现 Runnable 接口的任务对象作为线程。使用 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(); // 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 ");
      }
   }
}

Output

Thread main started
Main Thread finished
[Thread-2] Uninterrupted
[Thread-0] Interrupted
[Thread-1] Uninterrupted