Java 執行緒中斷(interrupt)與阻塞 (park)的區別
阿新 • • 發佈:2018-12-09
很多Java開發人員(包括我),尤其是剛進入軟體行業的新手,認為Java設定執行緒中斷就是表示執行緒停止了,不往前執行了,
Thread.currentThread().interrupt()
其實不是這樣的,執行緒中斷只是一個狀態而已,true表示已中斷,false表示未中斷
//獲取執行緒中斷狀態,如果中斷了返回true,否則返回falseThread.currentThread().isInterrupted() 設定執行緒中斷不影響執行緒的繼續執行,但是執行緒設定中斷後,執行緒內呼叫了wait、jion、sleep方法中的一種, 立馬丟擲一個 InterruptedException,且中斷標誌被清除,重新設定為false。
class Thread2 implements Runnable{
@Override public void run() { try { System.out.println(); System.out.println(hread.currentThread().isInterrupted());//輸出false Thread.currentThread().interrupt();//當前執行緒中斷 System.out.println("Thread.currentThread().isInterrupted());//輸出true Thread.sleep(3000);//中斷後執行sleep會丟擲異常 } catch (InterruptedException e) { e.printStackTrace(); System.out.println("Thread.currentThread().isInterrupted());//輸出false } } }
該如何讓執行緒真正停止不往前執行呢: 真正讓執行緒停止下來(阻塞),Java提供了一個較為底層的併發工具類:LockSupport,該類常用的方法有兩個,1
park(Object blocker) 表示阻塞指定執行緒,引數blocker當前執行緒物件 2 unpark(Thread thread) 喚醒指定執行緒,引數thread指定執行緒物件 示例:
public void test_LockSupport(){ Thread thread=new Thread(new Thread_park()); thread.start();//阻塞當前執行緒 Thread thread2=new Thread(new Thread_unpark(thread)); thread2.start();//喚醒被阻塞的執行緒 } class Thread_park implements Runnable{ @Override public void run() { System.out.println("Thread_park開始"); LockSupport.park(this);//阻塞當前執行緒 System.out.println("Thread_park結束"); } } class Thread_unpark implements Runnable{ private Thread thread; public Thread_unpark(Thread thread) { this.thread = thread; } @Override public void run() { System.out.println("Thread_unpark開始"); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } LockSupport.unpark(thread);//喚醒被阻塞的執行緒 System.out.println("Thread_unpark結束"); } }