Java 教程

Java 控制语句

面向对象编程

Java 内置类

Java 文件处理

Java 错误和异常

Java 多线程

Java 同步

Java 网络编程

Java 集合

Java 接口

Java 数据结构

Java 集合算法

高级 Java

Java 杂项

Java API 和框架

Java 类参考

Java 有用资源

Java - 中断线程



在 Java 中中断线程

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

中断线程的方法

Thread 类 提供了三种中断线程的方法:

中断 Java 线程的示例

在此示例中,我们创建了一个 Task 对象,它已实现 Runnable 接口以充当线程。使用 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(); // 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;
         }
      }
   }
}

输出

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 线程的示例

在此示例中,我们处理中断并继续线程。我们创建了一个 Task 对象,它已实现 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()");
		}        
      }
   }
}

输出

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() 方法的使用,以检查线程是否已中断。我们创建了多个 Task 对象,它们已实现 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 ");
      }
   }
}

输出

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

© . All rights reserved.