1,、sleep方法
public static void sleep(long millis, int nanos) throws InterruptedException
public static native void sleep(long millis) throws InterruptedException;
sleep方法的作用是讓當(dāng)前線程暫停執(zhí)行指定時(shí)間,,給執(zhí)行機(jī)會(huì)留給其他線程,但是調(diào)用sleep不會(huì)釋放對(duì)象鎖
1.1,、用TimeUnit代替Thread.sleep
??可以使用TimeUnit類代替Thread.sleep,,TimeUnit是jdk1.5以后增加的一個(gè)枚舉類,對(duì)sleep方法提供了很好的封裝,,可以省去時(shí)間單位的換算,。
思考1:sleep(n)和sleep(0)有什么不同 ??線程有Runnable和Waiting兩種狀態(tài),Runnable狀態(tài)又包含就緒狀態(tài)和運(yùn)行狀態(tài),,當(dāng)調(diào)用sleep(n)時(shí),,當(dāng)前線程從運(yùn)行狀態(tài)轉(zhuǎn)為等待狀態(tài),線程被放入等待隊(duì)列,,等待定時(shí)器n秒后的中斷事件,,當(dāng)?shù)竭_(dá)n秒計(jì)時(shí)時(shí),,線程從等待隊(duì)列進(jìn)入到就緒隊(duì)列。需要注意的是等待隊(duì)列里的線程是不參與CPU競爭的,,而就緒隊(duì)列里的線程才會(huì)參與CPU競爭,; ??當(dāng)調(diào)用sleep(0)時(shí),當(dāng)前線程是直接從運(yùn)行狀態(tài)轉(zhuǎn)為就緒狀態(tài)的,,即線程直接進(jìn)入到了就緒隊(duì)列,,就會(huì)參與CPU競爭。當(dāng)然調(diào)用sleep(0)的目的并非真正的讓線程掛起0毫秒,,而是在于讓當(dāng)前線程暫時(shí)放棄CPU,,給執(zhí)行機(jī)會(huì)留給其它線程,相當(dāng)于一個(gè)讓位動(dòng)作,。
思考2:如何喚醒正在睡眠的線程(sleeping) ??調(diào)用Sleep(n)會(huì)使得當(dāng)前線程暫停執(zhí)行指定時(shí)間,,線程進(jìn)入等待隊(duì)列,并且不會(huì)釋放對(duì)象鎖,,這時(shí)線程狀態(tài)就變?yōu)樽枞麪顟B(tài),,如果另外一個(gè)線程調(diào)用被阻塞線程的interrupt方法,那么就可以打斷這種阻塞,,并且會(huì)拋出InterruptedException,,但是如果線程已經(jīng)是死亡的狀態(tài)了,那么嘗試對(duì)其interrupt就會(huì)被忽略,。 類似Object的wait,、Thread的sleep、Thread的join等方法都會(huì)使得線程進(jìn)入阻塞狀態(tài),,調(diào)用Thread的interrupt都會(huì)打斷這種阻塞,。
2、currentThread方法
??currentThread方法返回的是一個(gè)線程實(shí)例,,這個(gè)實(shí)例就是指當(dāng)前代碼正在被哪個(gè)線程調(diào)用的線程實(shí)例,,可以通過這個(gè)方法來獲取線程的相關(guān)的一些信息,比如線程ID,,線程名稱等,。
public static native Thread currentThread();
3、getId方法
??getId方法返回的是線程的ID,,這個(gè)線程ID是在線程初始化時(shí)生成的一個(gè)唯一長整型數(shù)值
public long getId()
??在創(chuàng)建線程的初始化方法里設(shè)置線程ID,,生成線程ID的方法是一個(gè)靜態(tài)同步方法,保證了生成ID的唯一性
private void init(...){
...省略...
// 設(shè)置線程ID
tid = nextThreadID();
}
// 生成線程ID
private static synchronized long nextThreadID() {
return ++threadSeqNumber;
}
4,、getName方法
??getName方法返回的是線程名稱,,在創(chuàng)建線程初始化的時(shí)候生成
public final String getName()
public Thread(Runnable target) {
init(null, target, "Thread-" + nextThreadNum(), 0);
}
private static synchronized int nextThreadNum() {
return threadInitNumber++;
}
5、isAlive方法
??isAlive是用來判斷一個(gè)線程是否存活,而判斷一個(gè)線程是否存活在于線程已經(jīng)啟動(dòng)但是還沒有死亡(也就是線程執(zhí)行完畢)
public final native boolean isAlive();
6,、interrupt方法
??interrupt方法用來中斷線程可以中斷Object#wait,、Thread#join、Thread#sleep等各自的一系列方法,,并且會(huì)拋出一個(gè)InterruptedException異常 當(dāng)調(diào)用上述方法時(shí),,會(huì)使得線程進(jìn)入一個(gè)阻塞的狀態(tài),在另一個(gè)線程里調(diào)用某線程的interrupt方法就可以打斷某個(gè)線程的阻塞狀態(tài),。但是打斷并是意味著線程的生命周期已經(jīng)結(jié)束,,僅僅是打斷了了這種阻塞的狀態(tài)。被中斷的線程會(huì)拋出InterruptedException異常,,這個(gè)異常相當(dāng)于是一個(gè)信號(hào)一樣,,通知當(dāng)前線程被打斷了。
7,、interrupted方法與isInterrupted方法
??interrupted():用來判斷當(dāng)前線程是否已經(jīng)中斷,,執(zhí)行后具有將狀態(tài)標(biāo)志置為false的功能
public static boolean interrupted() {
return currentThread().isInterrupted(true);
}
??isInterrupted():用來判斷某個(gè)線程是否已經(jīng)中斷,不具有清除狀態(tài)標(biāo)志的功能
public boolean isInterrupted() {
return isInterrupted(false);
}
private native boolean isInterrupted(boolean ClearInterrupted);
8,、join方法
??join方法就是主線程中調(diào)用子線程的join方法,,主線程會(huì)等待子線程執(zhí)行完畢后,才會(huì)繼續(xù)執(zhí)行,。 ??join方法底層是調(diào)用Object類的wait方法,因此也必須加對(duì)象鎖
public final synchronized void join(long millis) throws InterruptedException
public final synchronized void join(long millis, int nanos) throws InterruptedException
public final void join() throws InterruptedException {
join(0);
}
9,、yield方法
??調(diào)用yield方法就是暗示線程調(diào)度執(zhí)行器,,當(dāng)前線程愿意讓出當(dāng)前處理器的使用,給執(zhí)行機(jī)會(huì)留給其他線程,,但是線程調(diào)度執(zhí)行器也可以忽略這個(gè)暗示,,說白了就是這個(gè)讓出了處理器的線程,可以再次被線程調(diào)度執(zhí)行器選中占有處理器從而繼續(xù)執(zhí)行,。
public static native void yield();
|