線程方法大總結

目錄

一. 線程等待(wait)

二. 線程睡眠(sleep)

三. 線程讓步(yield)

四. 線程中斷(interrupt)

五. 線程喚醒(notify)

六. 其他方法:



一. 線程等待(wait)

調用該方法的線程進入 WAITING 狀態,只有等待另外線程的通知或被中斷纔會返回,需要注意的
是調用 wait()方法後, 會釋放對象的鎖。因此, wait 方法一般用在同步方法或同步代碼塊中。


二. 線程睡眠(sleep)

sleep 導致當前線程休眠,與 wait 方法不同的是 sleep 不會釋放當前佔有的鎖,sleep(long)會導致
線程進入 TIMED-WATING 狀態,而 wait()方法會導致當前線程進入 WATING 狀態


三. 線程讓步(yield)

yield 會使當前線程讓出 CPU 執行時間片,與其他線程一起重新競爭 CPU 時間片。一般情況下,
優先級高的線程有更大的可能性成功競爭得到 CPU 時間片, 但這又不是絕對的,有的操作系統對
線程優先級並不敏感。


四. 線程中斷(interrupt)

中斷一個線程,其本意是給這個線程一個通知信號,會影響這個線程內部的一箇中斷標識位。 這
個線程本身並不會因此而改變狀態(如阻塞,終止等)。
1. 調用 interrupt()方法並不會中斷一個正在運行的線程。也就是說處於 Running 狀態的線
程並不會因爲被中斷而被終止,僅僅改變了內部維護的中斷標識位而已。
2. 若調用 sleep()而使線程處於 TIMED-WATING 狀態,這時調用 interrupt()方法,會拋出
InterruptedException,從而使線程提前結束 TIMED-WATING 狀態。
3. 許多聲明拋出 InterruptedException 的方法(如 Thread.sleep(long mills 方法)),拋出異
常前,都會清除中斷標識位,所以拋出異常後,調用 isInterrupted()方法將會返回 false。
4. 中斷狀態是線程固有的一個標識位,可以通過此標識位安全的終止線程。比如,你想終止
一個線程 thread 的時候,可以調用 thread.interrupt()方法,在線程的 run 方法內部可以
根據 thread.isInterrupted()的值來優雅的終止線程。
5. Join 等待其他線程終止在當前線程中調用一個線程的 join() 方法,則當前線程轉爲阻塞
狀態,回到另一個線程結束,當前線程再由阻塞狀態變爲就緒狀態,等待 cpu 的寵幸。
6. 爲什麼要用 join()方法?
很多情況下,主線程生成並啓動了子線程,需要用到子線程返回的結果,也就是需要主線程需要
在子線程結束後再結束,這時候就要用到 join() 方法。

System.out.println(Thread.currentThread().getName() + "線程運行開始!");
Thread6 thread1 = new Thread6();
thread1.setName("線程 B");
thread1.join();
System.out.println("這時 thread1 執行完畢之後才能執行主線程");

五. 線程喚醒(notify)

Object 類中的 notify() 方法, 喚醒在此對象監視器上等待的單個線程,如果所有線程都在此對象
上等待,則會選擇喚醒其中一個線程,選擇是任意的,並在對實現做出決定時發生,線程通過調
用其中一個 wait() 方法,在對象的監視器上等待, 直到當前的線程放棄此對象上的鎖定,才能繼
續執行被喚醒的線程,被喚醒的線程將以常規方式與在該對象上主動同步的其他所有線程進行競
爭。類似的方法還有 notifyAll() ,喚醒再次監視器上等待的所有線程。


六. 其他方法:

1. sleep():強迫一個線程睡眠N毫秒。
2. isAlive(): 判斷一個線程是否存活。
3. join(): 等待線程終止。
4. activeCount(): 程序中活躍的線程數。
5. enumerate(): 枚舉程序中的線程。
6. currentThread(): 得到當前線程。
7. isDaemon(): 一個線程是否爲守護線程。
8. setDaemon(): 設置一個線程爲守護線程。 (用戶線程和守護線程的區別在於,是否等待主線程依賴於主線程結束而結束)
9. setName(): 爲線程設置一個名稱。
10. wait(): 強迫一個線程等待。
11. notify(): 通知一個線程繼續運行。
12. setPriority(): 設置一個線程的優先級。
13. getPriority()::獲得一個線程的優先級。
 

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