三、Thread API的簡單介紹

一、sleep方法

public static void sleep(long millis, int nanos) throws InterruptedException 
public static native void sleep(long millis) throws InterruptedException;

sleep方法的做用是讓當前線程暫停執行指定時間,給執行機會留給其餘線程,可是調用sleep不會釋放對象鎖java

1.一、用TimeUnit代替Thread.sleep

  可使用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方法

  currentThread方法返回的是一個線程實例,這個實例就是指當前代碼正在被哪一個線程調用的線程實例,能夠經過這個方法來獲取線程的相關的一些信息,好比線程ID,線程名稱等。生命週期

public static native Thread currentThread();

三、getId方法

  getId方法返回的是線程的ID,這個線程ID是在線程初始化時生成的一個惟一長整型數值隊列

public long getId()

  在建立線程的初始化方法裏設置線程ID,生成線程ID的方法是一個靜態同步方法,保證了生成ID的惟一性事件

private void init(...){
    ...省略...
    // 設置線程ID
    tid = nextThreadID();
}    
// 生成線程ID
private static synchronized long nextThreadID() {
    return ++threadSeqNumber;
}

四、getName方法

  getName方法返回的是線程名稱,在建立線程初始化的時候生成get

public final String getName()

public Thread(Runnable target) {
    init(null, target, "Thread-" + nextThreadNum(), 0);
}

private static synchronized int nextThreadNum() {
    return threadInitNumber++;
}

五、isAlive方法

  isAlive是用來判斷一個線程是否存活,而判斷一個線程是否存活在於線程已經啓動可是尚未死亡(也就是線程執行完畢)同步

public final native boolean isAlive();

六、interrupt方法

  interrupt方法用來中斷線程能夠中斷Object#wait、Thread#join、Thread#sleep等各自的一系列方法,而且會拋出一個InterruptedException異常
當調用上述方法時,會使得線程進入一個阻塞的狀態,在另外一個線程裏調用某線程的interrupt方法就能夠打斷某個線程的阻塞狀態。可是打斷並是意味着線程的生命週期已經結束,僅僅是打斷了了這種阻塞的狀態。被中斷的線程會拋出InterruptedException異常,這個異常至關因而一個信號同樣,通知當前線程被打斷了。it

七、interrupted方法與isInterrupted方法

  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方法,主線程會等待子線程執行完畢後,纔會繼續執行。
  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方法

  調用yield方法就是暗示線程調度執行器,當前線程願意讓出當前處理器的使用,給執行機會留給其餘線程,可是線程調度執行器也能夠忽略這個暗示,說白了就是這個讓出了處理器的線程,能夠再次被線程調度執行器選中佔有處理器從而繼續執行。

public static native void yield();
相關文章
相關標籤/搜索