一、執行緒有哪些狀態?
執行緒通常都有五種狀態,創建、就緒、運行、阻塞和死亡。
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中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

禪工作室 13.0.1
強大的PHP整合開發環境

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

Dreamweaver CS6
視覺化網頁開發工具