public static void sleep(long millis, int nanos) throws InterruptedException public static native void sleep(long millis) throws InterruptedException;
sleep方法的做用是讓當前線程暫停執行指定時間,給執行機會留給其餘線程,可是調用sleep不會釋放對象鎖java
可使用TimeUnit類代替Thread.sleep,TimeUnit是jdk1.5之後增長的一個枚舉類,對sleep方法提供了很好的封裝,能夠省去時間單位的換算。線程
思考1:sleep(n)和sleep(0)有什麼不一樣
線程有Runnable和Waiting兩種狀態,Runnable狀態又包含就緒狀態和運行狀態,當調用sleep(n)時,當前線程從運行狀態轉爲等待狀態,線程被放入等待隊列,等待定時器n秒後的中斷事件,當到達n秒計時時,線程從等待隊列進入到就緒隊列。須要注意的是等待隊列裏的線程是不參與CPU競爭的,而就緒隊列裏的線程纔會參與CPU競爭;
當調用sleep(0)時,當前線程是直接從運行狀態轉爲就緒狀態的,即線程直接進入到了就緒隊列,就會參與CPU競爭。固然調用sleep(0)的目的並不是真正的讓線程掛起0毫秒,而是在於讓當前線程暫時放棄CPU,給執行機會留給其它線程,至關於一個讓位動做。code
思考2:如何喚醒正在睡眠的線程(sleeping)
調用Sleep(n)會使得當前線程暫停執行指定時間,線程進入等待隊列,而且不會釋放對象鎖,這時線程狀態就變爲阻塞狀態,若是另一個線程調用被阻塞線程的interrupt方法,那麼就能夠打斷這種阻塞,而且會拋出InterruptedException,可是若是線程已是死亡的狀態了,那麼嘗試對其interrupt就會被忽略。
相似Object的wait、Thread的sleep、Thread的join等方法都會使得線程進入阻塞狀態,調用Thread的interrupt都會打斷這種阻塞。對象
currentThread方法返回的是一個線程實例,這個實例就是指當前代碼正在被哪一個線程調用的線程實例,能夠經過這個方法來獲取線程的相關的一些信息,好比線程ID,線程名稱等。生命週期
public static native Thread currentThread();
getId方法返回的是線程的ID,這個線程ID是在線程初始化時生成的一個惟一長整型數值隊列
public long getId()
在建立線程的初始化方法裏設置線程ID,生成線程ID的方法是一個靜態同步方法,保證了生成ID的惟一性事件
private void init(...){ ...省略... // 設置線程ID tid = nextThreadID(); } // 生成線程ID private static synchronized long nextThreadID() { return ++threadSeqNumber; }
getName方法返回的是線程名稱,在建立線程初始化的時候生成get
public final String getName() public Thread(Runnable target) { init(null, target, "Thread-" + nextThreadNum(), 0); } private static synchronized int nextThreadNum() { return threadInitNumber++; }
isAlive是用來判斷一個線程是否存活,而判斷一個線程是否存活在於線程已經啓動可是尚未死亡(也就是線程執行完畢)同步
public final native boolean isAlive();
interrupt方法用來中斷線程能夠中斷Object#wait、Thread#join、Thread#sleep等各自的一系列方法,而且會拋出一個InterruptedException異常
當調用上述方法時,會使得線程進入一個阻塞的狀態,在另外一個線程裏調用某線程的interrupt方法就能夠打斷某個線程的阻塞狀態。可是打斷並是意味着線程的生命週期已經結束,僅僅是打斷了了這種阻塞的狀態。被中斷的線程會拋出InterruptedException異常,這個異常至關因而一個信號同樣,通知當前線程被打斷了。it
interrupted():用來判斷當前線程是否已經中斷,執行後具備將狀態標誌置爲false的功能
public static boolean interrupted() { return currentThread().isInterrupted(true); }
isInterrupted():用來判斷某個線程是否已經中斷,不具備清除狀態標誌的功能
public boolean isInterrupted() { return isInterrupted(false); } private native boolean isInterrupted(boolean ClearInterrupted);
join方法就是主線程中調用子線程的join方法,主線程會等待子線程執行完畢後,纔會繼續執行。
join方法底層是調用Object類的wait方法,所以也必須加對象鎖
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); }
調用yield方法就是暗示線程調度執行器,當前線程願意讓出當前處理器的使用,給執行機會留給其餘線程,可是線程調度執行器也能夠忽略這個暗示,說白了就是這個讓出了處理器的線程,能夠再次被線程調度執行器選中佔有處理器從而繼續執行。
public static native void yield();