1、複習上次連載
-
-
-
-
三種建立方式: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()
-
-
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
-
註釋掉Thread.yield()
-
這個方法的目的就是讓CPU讓出本身尚未用完的時間片,讓本身的線程處於就緒狀態,多用於測試等
1.yield與sleep方法的區別
-
sleep調用線程處於阻塞,掛起狀態,等待必定時間後再次恢復
-
yield是讓出未用完的時間片,該線程處於就緒狀態
-
7、源碼:
-
https://github.com/ruigege66/ConcurrentJava
-
-
-
歡迎關注微信公衆號:傅里葉變換,我的帳號,僅用於技術交流