農林漁牧網

您現在的位置是:首頁 > 農業

這些Java多執行緒面試題,你都明白了嗎?

2022-06-01由 metashops 發表于 農業

殺執行緒資料丟失怎麼解決

1、程序、執行緒、並行及併發是什麼?

程序

:就是一個應用程式,相當於一個軟體,如果殺掉一個程序,軟體就終止了

執行緒

:就是一個程序中的執行場景或一個執行單元,一個程序可以啟動多個執行緒

並行

:多個處理器或多核處理器同時處理多個任務

併發

:多個任務在同一個CPU核上,按細分的時間片輪流執行

2、實現執行緒的常用二種方式

第一種:編寫一類,直接繼承Java。lang。Thread,重寫run方法即可。

public class ThreadTest01 {

public static void main(String[] args) {

MyThread thread = new MyThread();

//start()作用是:啟動一個分支執行緒,在JVM中開闢一個新的棧空間,執行完,瞬間結束

//這段程式碼任務是開啟一個新的棧空間,只要新的棧空間開出來,start就結束,執行緒就啟動成功

//啟動成功執行緒會呼叫run方法,且run方法分支棧的棧低部(壓棧)

//run方法在分支棧的棧底,和main是平級的

thread。start();

for (int i = 0; i < 1000000000; i++) {

System。out。println(“主執行緒——->” + i);

}

}

}

class MyThread extends Thread {

@Override

public void run() {

System。out。println(“分支執行緒——->” + i);

第二種:編寫一類,實現Java。lang。Runnable介面,實現run方法即可。

這些Java多執行緒面試題,你都明白了嗎?

使用匿名內部類建立執行緒

這些Java多執行緒面試題,你都明白了嗎?

注:

實現Runnable和繼承Thread區別

使用實現Runnable介面的方式更能體現面向物件的程式設計思想

Runnable內部的程式碼可以被多個執行緒共享,適用於多個執行緒處理同一資源的情況

如果繼承Thread類,但是由於java單繼承的特性,此類不可再繼承其他類

3、run()方法和start()方法的區別

run()

方法不會啟動執行緒,不會分配新的分支棧,是單執行緒的(用於執行執行緒的執行程式碼,可重複呼叫)

start()

方法啟動一個分支執行緒,在JVM中開闢一個新的棧空間,執行完,瞬間結束

4、執行緒生命週期

(1)新建狀態:例項化執行緒的時候,也就是剛new出來的執行緒物件

(2)就緒狀態:new出來的執行緒物件後,呼叫start方法後,當一個執行緒搶到CPU時間片之後,它就開始執行run方法,如果run方法開始執行就標示著執行緒進入執行狀態。(就緒狀態:表示當前執行緒具有搶奪CPU時間片的權利,搶到時間片才能有執行權)

(3)執行狀態:run方法執行標示著這個執行緒進入執行狀態,如當前CPU時間片用完啦,會重新回到

就緒狀態

繼續搶奪時間片,搶到時間片,再重新進入run方法接著上一次的程式碼繼續 執行下去。

(4)死亡狀態:執行緒的run()方法執行完畢。

(5)阻塞狀態:當一個正在執行執行緒遇到某種情況下暫時放棄當前佔有的CPU時間片,同時也是暫停執行,就進入阻塞狀態。一旦執行緒甦醒後,會再次進入

就緒狀態

繼續搶奪CPU時間片。

這些Java多執行緒面試題,你都明白了嗎?

5、如何獲取執行緒物件和名字及修改(瞭解即可)

主要講解如何獲取執行緒物件,如何獲取執行緒物件名字及如何修改執行緒物件的名字,程式碼如下。

這些Java多執行緒面試題,你都明白了嗎?

6、多執行緒併發環境,如何確保資料安全問題

重點:專案執行在伺服器中,而伺服器已經幫我們將執行緒定義了,比如執行緒啟動、執行緒蠢建立等都已經給我們實現啦。

但是更重要等是,我們需要將專案放到一個多執行緒環境下執行,需要關注的是這些資料在多執行緒併發環境下,到底安全不安全。

7、什麼時候存線上程安全問題?

滿足以下三個條件,會存線上程安全:

多執行緒併發

有共享資料

共享資料有修改的行為

8、解決執行緒安全問題

使用“執行緒同步機制”也就是執行緒必須排序執行,說到執行緒同步,我們來了解什麼是

“非同步程式設計模型”和“同步程式設計模型”

。非同步程式設計模型其實就是

多執行緒併發(效率高)

,可以理解為各自執行緒執行各自的,無不干擾,而同步程式設計模型就是

執行緒排隊(效率低 )

,理解為t1執行緒執行時,必須等待t2執行緒執行結束才執行。

9、sleep()和wait()方法的區別?

(1)類的不同:sleep來自於Thread,而wait來自於object。

(2)釋放鎖:sleep不釋放鎖,而wait釋放鎖。

(3)用法不同:sleep時間到會自動恢復,wait可以用notify()或ontiftall直接喚醒。

注:notifyall()會喚醒所有執行緒,ontift喚醒一個執行緒。

寫作不易,如果幫到你記得來個三連【點贊+關注+分享】。如有錯誤,還請各位趕緊說句話,非常感謝!