Interrupt một thread trong java hay làm gián đoạn một luồng trong java. Nếu thread nằm trong trạng thái sleep hoặc wait (nghĩa là sleep() hoặc wait() được gọi ra), việc gọi phương thức interrupt() trên thread đó sẽ phá vỡ trạng thái sleep hoặc wait và ném ra ngoại lệ InterruptedException. Nếu thread không ở trong trạng thái sleep hoặc wait, việc gọi phương thức interrupt() thực hiện hành vi bình thường và không làm gián đoạn thread nhưng đặt cờ interrupt thành true. Trước hết chúng ta sẽ quan tâm đến các phương thức được cung cấp bởi lớp Thread để làm gián đoạn một luồng.
3 phương thức được cung cấp bởi lớp Thread để làm gián đoạn một luồng trong java
- public void interrupt()
- public static boolean interrupted()
- public boolean isInterrupted()
Nội dung chính
- Ví dụ về interrupt một thread trong java khiến thread ngừng hoạt động
- Ví dụ về interrupt một thread trong java mà thread không ngừng hoạt động
- Ví dụ về interrupt một thread trong java mà thread hoạt động bình thường
- Các phương thức isInterrupted và interrupted
- Ví dụ về interrupt một thread trong java mà thread hoạt động bình thường
Ví dụ về interrupt một thread trong java khiến thread ngừng hoạt động
Trong ví dụ này, sau khi gọi phương thức interrupt() để làm gián đoạn thread, sẽ xảy ra ngoại lệ InterruptedException, dẫn đến thread sẽ ngừng hoạt động. Nếu chúng ta không muốn dừng thread, chúng ta có thể xử lý tại nơi phương thức sleep() hoặc wait() được gọi ra.
File: TestInterruptingThread1.java
public class TestInterruptingThread1 extends Thread { public void run() { try { Thread.sleep(1000); System.out.println("task"); } catch (InterruptedException e) { throw new RuntimeException("Thread interrupted...\n" + e); } System.out.println("thread is running..."); } public static void main(String args[]) { TestInterruptingThread1 t1 = new TestInterruptingThread1(); t1.start(); try { t1.interrupt(); } catch (Exception e) { System.out.println("Exception handled \n" + e); } } }
Output:
Exception in thread "Thread-0" java.lang.RuntimeException: Thread interrupted... java.lang.InterruptedException: sleep interrupted at vn.test.TestInterruptingThread1.run(TestInterruptingThread1.java:9)
Ví dụ về interrupt một thread trong java mà thread không ngừng hoạt động
Trong ví dụ này, sau khi làm gián đoạn thread, chúng ta xử lý ngoại lệ, vì vậy nó sẽ phá vỡ sleep nhưng thread sẽ không ngừng hoạt động.
public class TestInterruptingThread2 extends Thread { public void run() { try { Thread.sleep(1000); System.out.println("task"); } catch (InterruptedException e) { System.out.println("Exception handled " + e); } System.out.println("thread is running..."); } public static void main(String args[]) { TestInterruptingThread2 t1 = new TestInterruptingThread2(); t1.start(); t1.interrupt(); } }
Output:
Exception handled java.lang.InterruptedException: sleep interrupted thread is running...
Ví dụ về interrupt một thread trong java mà thread hoạt động bình thường
Nếu thread không ở trạng thái sleep hoặc wait, việc gọi phương thức interrupt() sẽ thiết lập cờ interrupted thành true mà về sau có thể được sử dụng để dừng thread bởi lập trình viên.
File: TestInterruptingThread3.java
public class TestInterruptingThread3 extends Thread { public void run() { for (int i = 1; i <= 5; i++) System.out.println(i); } public static void main(String args[]) { TestInterruptingThread3 t1 = new TestInterruptingThread3(); t1.start(); t1.interrupt(); } }
Output:
1 2 3 4 5
Các phương thức isInterrupted và interrupted
Phương thức isInterrupted() trả về cờ interrupted là true hoặc false. Phương thức static interrupted() trả về cờ interrupted sau đó nó đặt cờ thành false nếu nó là true.
Ví dụ về interrupt một thread trong java mà thread hoạt động bình thường
Nếu thread không ở trạng thái sleep hoặc wait, việc gọi phương thức interrupt() sẽ thiết lập cờ interrupted thành true mà về sau có thể được sử dụng để dừng thread bởi lập trình viên.
File: TestInterruptingThread3.java
public class TestInterruptingThread4 extends Thread { public void run() { for (int i = 1; i <= 2; i++) { if (Thread.interrupted()) { System.out.println("thread bị gián đoạn..."); } else { System.out.println("thread bình thường"); } } } public static void main(String args[]) { TestInterruptingThread4 t1 = new TestInterruptingThread4(); TestInterruptingThread4 t2 = new TestInterruptingThread4(); t1.start(); t1.interrupt(); t2.start(); } }
Output:
thread bị gián đoạn... thread bình thường thread bình thường thread bình thường