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 
廣告