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

1、複習上次連載

  • 兩個基本單位
  • 線程進程的組成
  • 程序計數器定義以及執行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()}} 防虛假喚醒

2、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);
}

3、notify()和notifyAll()函數

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

4、join方法

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

5、sleep方法

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

6、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是讓出未用完的時間片,該線程處於就緒狀態

7、源碼:

相關文章
相關標籤/搜索