1.Object類線程
wait(空參的)線程進入waiting狀態(有參的)線程進入timed_waiting狀態對象
notify接口
notifyAll資源
(1)notifyget
public final native void notify();同步
調用一個Object對象的notify()方法,就會喚醒一個正在等待該線程的鎖的線程it
(當前可能會有好幾個線程調用了該Object對象的重載的wait方法,等待喚醒,該方法只能喚醒一個,隨機的)io
喚醒的線程不會當即執行,它會與其餘線程一塊兒,爭奪資源yield
notify方法只能被持有該Object對象鎖的線程調用定時器
如何得到對象的鎖?
(1)執行該對象的同步實例方法
(2)執行該類的同步靜態方法
(3)執行該對象的同步代碼塊
同一時刻,只有一個線程擁有一個對象的鎖
若是當前線程沒有持有該對象的鎖,拋出異常:IllegalMonitorStateException
(2)notifyAll
public final native void notifyAll();
調用一個Object對象的notifyAll方法,會喚醒全部等待當前對象的鎖的線程
調用該方法的線程必須持有當前對象的鎖
喚醒全部等待該對象的鎖以後,一塊兒爭奪鎖
(3)空參wait() 至關於 wait(0)
調用一個Object對象的空參的wait()方法,會致使當前線程進入等待(waiting)狀態,直到另外一個線程調用該Object對象的notify()或者notifyAll()方法
調用wait方法時,當前線程必須持有該Object對象的鎖
調用該方法以後,調用該方法的線程進入該Object對象的等待池,並放棄該對象上的全部鎖
InterruptedException
IllegalMonitorStateException
public final void wait() throws InterruptedException {
wait(0);
}
public final native void wait(long timeout) throws InterruptedException;
public final void wait(long timeout, int nanos) throws InterruptedException{……}
(4)一個參數的wait(?)
調用一個Object對象的wait(?)方法,會致使當前線程進入超時等待(timed_waiting)狀態
*調用notify
*調用notifyAll()
*調用interrupt
*等待時間到
2.Thread類
run
start
sleep(沒有空參的,只有有參的)線程進入timed_waiting狀態
interrupt
yeild
join(空參的)線程進入waiting狀態(有參的)線程進入timed_waiting狀態
(1)start
使當前線程開始執行
調用start方法以後,JVM會調用當前線程的run方法
(2)run
若是當前線程實現了Runnable接口,則接口實現類的run方法被調用
若是直接調用run方法,不能啓動一個線程,至關於調用了一個普通方法
(3)sleep
沒有空參的方法
使線程進入TIMED_WAITING狀態
public static native void sleep(long millis) throws InterruptedException;
public static void sleep(long millis, int nanos)throws InterruptedException {……}
使當前正在執行的線程休眠(暫停執行)指定的毫秒數
受到系統定時器和調度器精度和準確度的影響
當前線程休眠指定的毫秒數,在休眠期間不會釋放它已經持有的任何鎖
InterruptedException(當前正在休眠的線程被其它線程打斷)
IllegalArgumentException(參數無效)
(4)join
public final void join() throws InterruptedException {
join(0);
}
public final synchronized void join(long millis) throws InterruptedException
public final synchronized void join(long millis, int nanos) throws InterruptedException
在當前線程內調用其它線程的join方法,當前線程進入Waiting或者TIMED_WAITING狀態
釋放已經持有的對象鎖
等待時間到或者其它線程執行完畢,當前線程進入就緒狀態
(5)yield
讓步,從而讓其餘具備相同優先級的線程獲取執行權,可是,並不能保證當前線程調用yield以後,其它具備相同優先級的線程就必定能得到執行權
提示調度器當前線程願意讓出當前正在使用的處理器
調度器能夠忽略該提示
線程從執行狀態變成就緒狀態
public static native void yield();
不會釋放鎖
(6)interrupt
將線程的中斷狀態設爲true
並不會馬上終止線程
判斷是否中斷:
判斷當前線程是否中斷,並清除中斷標誌
public static boolean interrupted() {
return currentThread().isInterrupted(true);
}
判斷方法調用線程是否中斷,不清楚中斷標誌
public boolean isInterrupted() {
return isInterrupted(false);
}
Object wait VS Thread sleep
(1)sleep沒有空參的重載形式
(2)wait釋放鎖 sleep持有鎖
(3)空參的sleep,使線程進入waiting狀態
(4)有參的wait和sleep,都會使線程進入TIMED_WAITING狀態
(5)都有InterruptedException
Object wait VS Thread yield
(1)wait釋放鎖
(2)yield不釋放鎖
(3)wait釋放鎖,使當前線程進入等待狀態
(4)yield不釋放鎖,使當前線程進入就緒狀態
(5)wait會使全部等待該對象鎖的線程都爭奪資源
(6)yield只會使同一優先級的就緒的線程爭奪資源
Tread.currentThread(0.getName();
isLive()