面試 多執行緒

2021-09-24 18:57:06 字數 2334 閱讀 5320

1.執行緒通常有五種狀態,建立,就緒,執行、阻塞和死亡狀態

2.阻塞的情況又分為三種:

(1)、等待阻塞執行的執行緒執行wait()方法,該執行緒會釋放占用的所有資源,jvm會把該執行緒放入「等待池」中。進入這個狀態後,是不能自動喚醒的,必須依靠其他執行緒呼叫notify()或notifyall()方法才能被喚醒,wait是object類的方法

(2)、同步阻塞執行的執行緒在獲取物件的同步鎖時,若該同步鎖被別的執行緒占用,則jvm會把該執行緒放入「鎖池」中。

(3)、其他阻塞執行的執行緒執行sleep()或join()方法,或者發出了i/o請求時,jvm會把該執行緒置為阻塞狀態。當sleep()狀態超時、join()等待執行緒終止或者超時、或者i/o處理完畢時,執行緒重新轉入就緒狀態。sleep是thread類的方法

1.新建狀態(new):新建立了乙個執行緒物件。

2.就緒狀態(runnable):執行緒物件建立後,其他執行緒呼叫了該物件的start()方法。該狀態的執行緒位於可執行執行緒池中,變得可執行,等待獲取cpu的使用權。

3.** 執行狀態(running)**:就緒狀態的執行緒獲取了cpu,執行程式**。

4.阻塞狀態(blocked):阻塞狀態是執行緒因為某種原因放棄cpu使用權,暫時停止執行。直到執行緒進入就緒狀態,才有機會轉到執行狀態。

阻塞的情況分三種:

(一)、等待阻塞:執行的執行緒執行wait()方法,jvm會把該執行緒放入等待池中。

(二)、同步阻塞:執行的執行緒在獲取物件的同步鎖時,若該同步鎖被別的執行緒占用,則jvm會把該執行緒放入鎖池中。

(三)、其他阻塞:執行的執行緒執行sleep()或join()方法,或者發出了i/o請求時,jvm會把該執行緒置為阻塞狀態。當sleep()狀態超時、join()等待執行緒終止或者超時、或者i/o處理完畢時,執行緒重新轉入就緒狀態。

5.死亡狀態(dead):執行緒執行完了或者因異常退出了run()方法,該執行緒結束生命週期。

1.sleep()方法

在指定時間內讓當前正在執行的執行緒暫停執行,但不會釋放「鎖標誌」。不推薦使用。

sleep()使當前執行緒進入阻塞狀態,在指定時間內不會執行。

2.wait()方法

在其他執行緒呼叫物件的notify或notifyall方法前,導致當前執行緒等待。執行緒會釋放掉它所占有的「鎖標誌」,從而使別的執行緒有機會搶占該鎖。

當前執行緒必須擁有當前物件鎖。如果當前執行緒不是此鎖的擁有者,會丟擲illegalmonitorstateexception異常。

喚醒當前物件鎖的等待執行緒使用notify或notifyall方法,也必須擁有相同的物件鎖,否則也會丟擲illegalmonitorstateexception異常。

waite()和notify()必須在synchronized函式或synchronized block中進行呼叫。如果在non-synchronized函式或non-synchronized block中進行呼叫,雖然能編譯通過,但在執行時會發生illegalmonitorstateexception的異常。

3.yield方法

暫停當前正在執行的執行緒物件。

yield()只是使當前執行緒重新回到可執行狀態,所以執行yield()的執行緒有可能在進入到可執行狀態後馬上又被執行。

yield()只能使同優先順序或更高優先順序的執行緒有執行的機會。

呼叫yield方法並不會讓執行緒進入阻塞狀態,而是讓執行緒重回就緒狀態,它只需要等待重新獲取cpu執行時間,這一點是和sleep方法不一樣的。

4.join方法

等待該執行緒終止。

等待呼叫join方法的執行緒結束,再繼續執行。如:t.join();//主要用於等待t執行緒執行結束,若無此句,main則會執行完畢,導致結果不可**。

在很多情況下,主線程建立並啟動了執行緒,如果子執行緒中藥進行大量耗時運算,主線程往往將早於子執行緒結束之前結束。這時,如果主線程想等待子執行緒執行完成之後再結束,比如子執行緒處理乙個資料,主線程要取得這個資料中的值,就要用到join()方法了。

方法join()的作用是等待執行緒物件銷毀。

java面試 多執行緒

面試總結 多執行緒 1 執行緒狀態 先簡單的看一下執行緒之間的狀態扭轉圖 從上面的圖中可以看出執行緒大概有就緒,執行,阻塞,死亡這幾個狀態,各個狀態之間的扭轉在圖中描寫挺清晰 2 執行緒池 面試過程中,經常會被問到執行緒池 執行緒池的一些核心引數 coresize,maxsize,overtime,...

多執行緒面試 4

執行緒的狀態 從thread的原始碼裡我們可以看到執行緒的狀態一共有如下六種 新建 new 執行緒建立後尚未啟動的執行緒的狀態,即new了乙個執行緒物件但是還沒有呼叫start 方法時處於的狀態.執行runnable 即執行緒物件呼叫了start 方法後的執行緒所處的狀態,包含running和rea...

面試 多執行緒基礎

作業系統中有若干程序併發執行,它們不斷申請 使用 釋放系統資源,雖然系統的程序協調 通訊機構會對它們進行控制,但也可能出現若干程序都相互等待對方釋放資源才能繼續執行,否則就阻塞的情況。此時,若不借助外界因素,誰也不能釋放資源,誰也不能解除阻塞狀態。根據這樣的情況,作業系統中的死鎖被定義為系統中兩個或...