首頁  >  文章  >  Java  >  2020全新Java面試題-多執行緒(二)

2020全新Java面試題-多執行緒(二)

王林
王林轉載
2020-05-07 16:57:582145瀏覽

2020全新Java面試題-多執行緒(二)

一、執行緒有哪些狀態?

執行緒通常都有五種狀態,創建、就緒、運行、阻塞和死亡。

1、創建狀態

在產生線程對象,並沒有呼叫該對象的start方法,這是線程處於創建狀態。

2、就緒狀態

當呼叫了線程物件的start方法之後,該線程就進入了就緒狀態,但是此時線程調度程序還沒有把該線程設定為當前線程,此時處於就緒狀態。在執行緒運行之後,從等待或睡眠回來之後,也會處於就緒狀態。

3、運行狀態

線程調度程序將處於就緒狀態的線程設定為當前線程,此時線程就進入了運行狀態,開始運行run函數當中的程式碼。

4、阻塞狀態

執行緒正在運作的時候,被暫停,通常是為了等待某個時間的發生(比如說某項資源就緒)之後再繼續運作。 sleep,suspend,wait等方法都可以導致執行緒阻塞。

5、死亡狀態

如果一個執行緒的run方法執行結束或呼叫stop方法後,該執行緒會死亡。對於已經死亡的線程,無法再使用start方法令其進入就緒。

(相關影片教學推薦:java影片

二、sleep() 和 wait() 有什麼不同?

1、sleep():方法是線程類別(Thread)的靜態方法,讓呼叫線程進入睡眠狀態,讓出執行機會給其他線程,等到休眠時間結束後,線程進入就緒狀態和其他執行緒一起競爭cpu的執行時間。因為sleep() 是static靜態的方法,他不能改變對象的機鎖,當一個synchronized塊中調用了sleep() 方法,線程雖然進入休眠,但是對象的機鎖沒有被釋放,其他線程依然無法訪問這個對象。

2、wait():wait()是Object類別的方法,當一個執行緒執行到wait方法時,它就進入一個和該物件相關的等待池,同時釋放物件的機鎖,使得其他執行緒能夠訪問,可以透過notify,notifyAll方法來喚醒等待的執行緒。

三、notify()和 notifyAll()有什麼差別?

如果執行緒呼叫了物件的 wait()方法,那麼執行緒就會處於該物件的等待池中,等待池中的執行緒不會去競爭該物件的鎖定。

當有執行緒呼叫了物件的notifyAll()方法(喚醒所有wait 執行緒)或notify()方法(只隨機喚醒一個wait 執行緒),被喚醒的執行緒就會進入該物件的鎖定池中,鎖定池中的執行緒會去競爭該物件鎖定。也就是說,呼叫了notify後只要一個執行緒會由等待池進入鎖定池,而notifyAll會將該物件等待池內的所有執行緒移到鎖定池中,等待鎖定競爭。

優先順序高的執行緒競爭到物件鎖的機率大,假若某執行緒沒有競爭到該物件鎖,它還會留在鎖定池中,只有執行緒再次呼叫wait()方法,它才會重新回到等待池中。而競爭到物件鎖的執行緒則繼續往下執行,直到執行完了 synchronized 程式碼區塊,它會釋放掉該物件鎖,這時鎖定池中的執行緒會繼續競爭該物件鎖定。

四、線程的 run()和 start()有什麼差別?

每個執行緒都是透過某個特定Thread物件所對應的方法run()來完成其操作的,方法run()稱為執行緒體。透過呼叫Thread類別的start()方法來啟動一個執行緒。

start()方法來啟動一個線程,真正實作了多執行緒運行。這時無需等待run方法體程式碼執行完畢,可以直接繼續執行下面的程式碼; 這時此執行緒是處於就緒狀態, 並沒有執行。然後透過此Thread類別呼叫方法run()來完成其運行狀態, 這裡方法run()稱為線程體,它包含了要執行的這個線程的內容, Run方法運行結束, 此線程終止。然後CPU再調度其它線程。

run()方法是在本執行緒裡的,只是執行緒裡的一個函數,而不是多執行緒的。如果直接呼叫run(),其實就相當於是呼叫了一個普通函數而已,直接待用run()方法必須等待run()方法執行完畢才能執行下面的程式碼,所以執行路徑還是只有一條,根本就沒有線程的特徵,所以在多執行緒執行時要使用start()方法而不是run()方法。

(推薦教學:java入門程式

五、建立執行緒池有哪幾種方式?

1、newFixedThreadPool(int nThreads)

#建立一個固定長度的線程池,每當提交一個任務就會建立一個線程,直到達到線程池的最大數量,這時線程規模將不再變化,當線程發生未預期的錯誤而結束時,線程池會補充一個新的線程。

2、newCachedThreadPool()

建立一個可快取的線程池,如果線程池的規模超過了處理需求,將自動回收空閒線程,而當需求增加時,則可以自動添加新線程,線程池的規模不存在任何限制。

3、newSingleThreadExecutor()

這是一個單一執行緒的Executor,它建立單一工作執行緒來執行任務,如果這個執行緒異常結束,會建立一個新的來取代它;它的特點是能確保依照任務在佇列中的順序來串列執行。

4、newScheduledThreadPool(int corePoolSize)

#建立了一個固定長度的執行緒池,而且以延遲或定時的方式來執行任務,類似於Timer。

更多面試題請追蹤java面試題欄位。

以上是2020全新Java面試題-多執行緒(二)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除