Java高併發2-線程wait、sleep、yield、notify、join方法總結

一、複習上次連載

  • 兩個基本單位
  • 線程進程的組成
  • 程序計數器定義以及執行native方法時是什麼
  • 三種創建方式:extends Thread 重寫run new 實例().start(); implements Runnable 重寫run new Thread(new 實例()).start(); implements Callable 重寫call(),有返回值 new FutureTask<返回值類型>(new 實例()) new Thread(new FutureTask()).start() FutureTask實例.get()
  • 關鍵字native,生成圖
  • synchronized(對象){} synchronized void method(變量){}
  • synchronized(obj){while(條件不滿足){obj.wait()}} 防虛假喚醒

二、wait()方法

1.使用注意點

  • 使用wait()方法用於阻塞該線程,該線程獲取了對象鎖之後,然後調用該對象的wait()方法,就是釋放該對象,其他線程可以緊接着調用。
  • 一個線程中如果多層獲取了對象鎖,那麼如果釋放其中一個或者多個,對其他未釋放的對象鎖是不會產生影響的。
  • 當一個線程調用共享對象的wait()方法被阻塞掛起後,如果其他線程中斷了該線程,則該線程會拋出一個InterruptedException異常並返回。

2.帶參數的wait()方法

  • wait(long timeout),參數單位爲ms,該方法代表線程掛起多少秒後超時返回,除非在此期間會使用notify()或者notifyAll()方法來喚醒線程。wait(0)與wait()方法一致,wait()方法內部實現機制就是wait(0);如果參數是一個負數,那麼就會返回一個IllegalArgumentException
  • 實現wait(long timeout,int nanos)函數
public final void wait(long timeout,int nanos) throws InterruptedException{
 if(timeout<0){
  throw new IllegalException("timeout value is negative");
 }
 if(nanos<0 || nanos > 999999){
  throw new IllegalException("nanosecond timeout value out of range");
 }
 if(nanos>0){
  timeout++;
 }
 wait(timeout);
}

三、notify()和notifyAll()函數

  • 一個線程調用共享對象的notify()方法之後,會喚醒一個在該共享變量上調用的wait系列方法後被掛起的線程,一個共享變量上可能有多個線程在等待,具體喚醒哪一個等待的線程是隨機的。被喚醒的線程不能馬上從wait方法返回並繼續執行,需要先獲得鎖,也就是說,被wait()方法掛起的線程必須競爭該鎖,獲得後才能繼續執行。notify()函數就是喚醒所有被掛起的線程

四、join方法

  • 該方法用於線程等待,也就說必須這條線程結束之後才能繼續下面的語句

五、sleep方法

  • 該方法是一個靜態方法,使用方法Thread.sleep(秒數),在睡眠期間其他線程調用了interrupt方法的話,該線程會拋出InterruptedException異常。

六、yield方法

package com.ruigege.threadFoundation1;

public class UserYieldMethod implements Runnable{
 
 public UserYieldMethod() {
  Thread thread = new Thread(this);
  thread.start();
 }
  
 @Override
 public void run() {
  System.out.println("開始一個線程"+Thread.currentThread());
  Thread.yield();
  System.out.println("結束一個線程"+Thread.currentThread());
  
 }
 
 public static void main(String[] args) {
  new UserYieldMethod();
  new UserYieldMethod();
  new UserYieldMethod();
 }
}
2.1
2.1
  • 註釋掉Thread.yield() 2.2
  • 這個方法的目的就是讓CPU讓出自己還沒有用完的時間片,讓自己的線程處於就緒狀態,多用於測試等

1.yield與sleep方法的區別

  • sleep調用線程處於阻塞,掛起狀態,等待一定時間後再次恢復
  • yield是讓出未用完的時間片,該線程處於就緒狀態

七、源碼:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章