首頁  >  文章  >  Java  >  Java執行緒中斷與阻塞有什麼不同? Java線程中斷與阻塞的對比

Java執行緒中斷與阻塞有什麼不同? Java線程中斷與阻塞的對比

不言
不言原創
2018-09-15 16:51:062644瀏覽

這篇文章帶給大家的內容是關於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執行緒中斷與阻塞有什麼不同? Java線程中斷與阻塞的對比的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn