3、Thread API的簡單介紹

1、sleep方法

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

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

1.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,給執行機會留給其它線程,相當於一個讓位動作。

思考2:如何喚醒正在睡眠的線程(sleeping)
  調用Sleep(n)會使得當前線程暫停執行指定時間,線程進入等待隊列,並且不會釋放對象鎖,這時線程狀態就變爲阻塞狀態,如果另外一個線程調用被阻塞線程的interrupt方法,那麼就可以打斷這種阻塞,並且會拋出InterruptedException,但是如果線程已經是死亡的狀態了,那麼嘗試對其interrupt就會被忽略。
類似Object的wait、Thread的sleep、Thread的join等方法都會使得線程進入阻塞狀態,調用Thread的interrupt都會打斷這種阻塞。

2、currentThread方法

  currentThread方法返回的是一個線程實例,這個實例就是指當前代碼正在被哪個線程調用的線程實例,可以通過這個方法來獲取線程的相關的一些信息,比如線程ID,線程名稱等。

public static native Thread currentThread();

3、getId方法

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

public long getId()

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

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

4、getName方法

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

public final String getName()

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

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

5、isAlive方法

  isAlive是用來判斷一個線程是否存活,而判斷一個線程是否存活在於線程已經啓動但是還沒有死亡(也就是線程執行完畢)

public final native boolean isAlive();

6、interrupt方法

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

7、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);

8、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);
}

9、yield方法

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

public static native void yield();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章