初心
用interrupt中斷程序
初步實現
public class InterruptionInJava implements Runnable{ @Override public void run() { while (true) { if (Thread.currentThread().isInterrupted()) { System.out.println("Yes!! I'm Interupted, but I'm still running"); } else { } } // System.out.println("Oh, myGod!"); } public static void main(String[] args) { Thread thread = new Thread(new InterruptionInJava(), "testThread"); thread.start(); try { Thread.sleep(1000); } catch (InterruptedException e) { } System.out.println("Begin Interupt..."); thread.interrupt(); System.out.println("End Interupt..."); } }
輸出
Yes!! I'm Interupted, but I'm still running Yes!! I'm Interupted, but I'm still running Yes!! I'm Interupted, but I'm still running Yes!! I'm Interupted, but I'm still running Yes!! I'm Interupted, but I'm still running Yes!! I'm Interupted, but I'm still running Yes!! I'm Interupted, but I'm still running .....
問題:雖然是被中斷狀態,但實際並未中斷
interrupt說明
在java中主要有3個相關方法,interrupt(),isInterrupted()和interrupted()。
- interrupt(),在一個線程中調用另一個線程的interrupt()方法,即會向那個線程發出信號——線程中斷狀態已被設置。至於那個線程何去何從,由具體的代碼實現決定。
- isInterrupted(),用來判斷當前線程的中斷狀態(true or false)。
- interrupted()是個Thread的static方法,用來恢復中斷狀態(!!!)
解決不中斷問題
處於被中斷狀態時,return 或 bread 中斷線程

public class InterruptionInJava implements Runnable{ @Override public void run() { while (true) { if (Thread.currentThread().isInterrupted()) { System.out.println("Yes!! I'm Interupted, but I'm still running"); return; } else { } } } public static void main(String[] args) { Thread thread = new Thread(new InterruptionInJava(), "testThread"); thread.start(); try { Thread.sleep(1000); } catch (InterruptedException e) { } System.out.println("Begin Interupt..."); thread.interrupt(); System.out.println("End Interupt..."); } }
等價開關
public class InterruptionInJava2 implements Runnable{ private volatile static boolean on = false; @Override public void run() { while (!on) { try { System.out.println("begin Sleep"); Thread.sleep(10000000); System.out.println("end Sleep"); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Oh, myGod!"); } } public static void main(String[] args) { Thread thread = new Thread(new InterruptionInJava2(), "testThread"); thread.start(); try { System.out.println("main Begin sleep"); Thread.sleep(5000); System.out.println("main End sleep"); } catch (InterruptedException e) { } InterruptionInJava2.on = true; } }
使用靜態變量on
但是在run方法中Thread.sleep(10000000),😱何時結束?
開關中斷解決方案
public class InterruptionInJava2 implements Runnable{ private volatile static boolean on = false; @Override public void run() { while (!on) { try { System.out.println("begin Sleep"); Thread.sleep(10000000); System.out.println("end Sleep"); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Oh, myGod!"); } } public static void main(String[] args) { Thread thread = new Thread(new InterruptionInJava2(), "testThread"); thread.start(); try { System.out.println("main Begin sleep"); Thread.sleep(5000); System.out.println("main End sleep"); } catch (InterruptedException e) { } InterruptionInJava2.on = true; System.out.println("Begin Interupt..."); thread.interrupt(); System.out.println("End Interupt..."); } }
輸出
begin Sleep
main Begin sleep
main End sleep
Begin Interupt...
End Interupt...
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at com.jihite.templet.JavaBase.InterruptionInJava2.run(InterruptionInJava2.java:11)
at java.lang.Thread.run(Thread.java:748)
Oh, myGod!
Process finished with exit code 0