每日一題-Java核心-談談你對線程的理解【面試八股文】
??Java線程是Java程序中的執行單元。一個Java程序可以同時運行多個線程,每個線程可以獨立執行不同的任務。線程的執行是并發的,即多個線程可以同時執行。
1. 線程的特點
??Java中的線程有如下的特點
-
輕量級:線程的創建和銷毀的開銷相對較小,可以創建大量的線程。
-
共享內存:多個線程可以共享同一塊內存區域,這使得線程之間可以方便地進行數據通信。
-
獨立調度:每個線程的執行是由操作系統進行調度的,線程的調度是非確定性的,也就是說無法預測線程的執行順序。
2.線程的創建方式
-
繼承Thread類:創建一個繼承自Thread類的子類,并重寫run()方法,在run()方法中定義線程的任務。然后通過調用子類的start()方法來啟動線程。
-
實現Runnable接口:創建一個實現了Runnable接口的類,并實現其run()方法,在run()方法中定義線程的任務。然后通過創建Thread對象,將實現了Runnable接口的對象作為參數傳入,并調用Thread對象的start()方法來啟動線程。
3.線程的狀態
??線程的狀態也是面試中會問的比較多的。
-
新建狀態(New):線程對象被創建后,但還沒有調用start()方法時的狀態。
-
就緒狀態(Runnable):線程對象調用start()方法后進入就緒狀態,表示線程可以被調度執行。
-
運行狀態(Running):線程被調度執行后進入運行狀態。
-
阻塞狀態(Blocked):線程在執行過程中可能因為某些原因被阻塞,例如等待輸入輸出、線程休眠等。
-
結束狀態(Terminated):線程執行完任務后進入結束狀態。
圖例如下:
4.線程間的通信
Java中線程間通信的方式有以下幾種:
-
wait()和notify()方法:wait()方法使線程進入等待狀態,直到其他線程調用notify()或notifyAll()方法將其喚醒。notify()方法喚醒一個等待中的線程,notifyAll()方法喚醒所有等待中的線程。
-
wait(long timeout)和notify()方法:wait(long timeout)方法使線程進入等待狀態,直到其他線程調用notify()方法將其喚醒,或者等待時間超過指定的timeout時間。notify()方法喚醒一個等待中的線程。
-
join()方法:join()方法使一個線程等待另一個線程執行完畢。當一個線程調用另一個線程的join()方法時,當前線程將被阻塞,直到另一個線程執行完畢。
-
Lock和Condition接口:Lock接口提供了比synchronized關鍵字更靈活的鎖機制,Condition接口提供了更靈活的等待/通知機制。通過Lock接口的lock()方法獲取鎖,unlock()方法釋放鎖;通過Condition接口的await()方法使線程等待,signal()方法喚醒一個等待中的線程,signalAll()方法喚醒所有等待中的線程。
-
BlockingQueue阻塞隊列:BlockingQueue是一個支持阻塞操作的隊列,當隊列為空時,獲取元素的線程將被阻塞,直到隊列中有可用元素;當隊列滿時,插入元素的線程將被阻塞,直到隊列有空閑位置。