1. 程式人生 > >Java 執行緒中斷(interrupt)與阻塞 (park)的區別

Java 執行緒中斷(interrupt)與阻塞 (park)的區別

    很多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結束");
    }
}