這篇文章帶給大家的內容是關於Java執行緒中斷與阻塞有什麼不同? Java線程中斷與阻塞的對比,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
很多Java開發人員(包括我),尤其是剛進入軟體產業的新手,認為Java設定執行緒中斷就是表示執行緒停止了,不往前執行了,
# Thread.currentThread().interrupt()
其實不是這樣的,執行緒中斷只是一個狀態而已,true表示已中斷,false表示未中斷
//取得執行緒中斷狀態,如果中斷了回傳true,否則回傳false
Thread.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结束"); } }
相關推薦:
詳解Java多執行緒程式設計中LockSupport類別的執行緒阻塞用法
以上是Java執行緒中斷與阻塞有什麼不同? Java線程中斷與阻塞的對比的詳細內容。更多資訊請關注PHP中文網其他相關文章!