40年的2021個Java多線程面試問題


本教程涵蓋了重要的Java多線程面試問題以及Java線程面試問題和Java並發麵試問題。

目錄

1.什麼是線程?

線程是遵循單獨執行路徑的子流程。 每個線程即使共享相同的進程資源也獨立執行。 每個線程在不同的堆棧框架中運行或執行。

2. Java中的多線程是什麼?

多線程是 執行一個或多個線程的過程 同時幫助完成多個任務。 每個線程通過共享相同的資源獨立執行。

3.多線程有哪些優勢?

  • 消耗更少的內存
  • 性能快
  • 更高效
  • 支持多任務
  • 一個線程中的異常不會影響另一個線程,因為線程是獨立的

4.線程的生命週期中有哪些不同狀態?

  • 可運行
  • 運行
  • 不可運行
  • 終止

5.創建線程有哪些不同的方法?

有兩種創建線程的方法:

  • 擴展線程類
  • 實現可運行類

6. Thread.start()方法的用途是什麼?

Thread.start()方法啟動線程進程,並用於運行run()方法。

7. Java中線程類的不同構造函數是什麼?

  • 線()
  • 線程(字符串名稱)
  • 線程(Runnable r)
  • 線程(Runnable r,字符串名稱)

8.是否可以啟動一個線程兩次?

這是常見的多線程之一 Java面試 的問題。

不,我們可以啟動一個線程兩次。 當我們嘗試像下面的示例中一樣重新啟動同一線程時,當它執行同一線程的第二個start()方法時,我們將獲得IllegalThreadStateException。

public class ThreadDemo extends Thread {
  
  public void run() {
    System.out.println("THread running");
  }

  public static void main(String[] args) {
    ThreadDemo t = new ThreadDemo();
    t.start();
    t.start();
  }

}
Exception in thread "main" THread running
java.lang.IllegalThreadStateException
  at java.base/java.lang.Thread.start(Thread.java:790)
  at ThreadDemo.main(ThreadDemo.java:11)

9.用於相互通信的線程有哪些不同的方法?

  • wait()方法
  • notify()方法
  • notifyAll()方法

10.用戶線程和守護線程之間有什麼區別?

用戶線程守護進程線程
高優先級線程低優先級線程
在前台運行在後台運行
執行特定的複雜任務執行輔助任務
JVM總是在關閉前等待活動用戶線程完成JVM在關閉前不等待守護程序線程完成
由Java應用程序創建,用於執行某些任務由JVM創建
它是獨立的這取決於用戶線程

11.如何在特定時間內暫停線程執行?

我們可以使用sleep()方法使線程在特定時間內暫停其執行。 喚醒後,它將狀態更改為可運行並根據線程調度程序執行。

12.什麼是線程優先級?

每個線程的優先級範圍為1到10,其中1最低,10最高。 最高優先級的線程始終具有優先執行的優先權,但也取決於線程調度程序的實現。

13.什麼是線程調度程序和時間分片?

線程調度程序是屬於以下內容的服務: 操作系統 計劃或分配用於線程執行的CPU時間。 一旦創建線程並啟動它,線程調度程序將根據其實現來決定何時執行該線程。

時間分片是為可運行線程分配可用CPU時間的過程。 這可能取決於線程優先級和線程等待時間。

14.多線程中的上下文切換是什麼?

上下文切換是多任務或多線程中使用的過程,我們可以在其中存儲和恢復線程的CPU狀態。 這有助於從特定時間後暫停的同一點繼續執行線程。

15.為什麼我們從同步的方法或塊中調用wait(),notify()和notifyAll()方法?

所有這些方法都依賴於對象監視器,因為如果線程處於等待狀態,則線程將離開對象監視器並返回直到調用notify()方法。 由於所有這些方法都需要彼此同步,因此我們僅需要從已同步的方法或塊中調用它們。

16.如何在Java中實現線程安全?

  • 同步
  • 原子並發類
  • 並發鎖接口
  • 易失性關鍵字
  • 不變的階級
  • 線程安全的類

17. volatile關鍵字的用途是什麼?

當我們 聲明一個變量 作為易失性,它直接從內存而不是從高速緩存中讀取變量的值。

18.如何創建守護線程?

我們可以使用Thread類的setDaemon(true)方法創建一個守護線程。 我們需要在調用start()方法之前使用此方法,否則它將引發IllegalThreadStateException。

19.什麼是Java中的線程轉儲?

線程轉儲是一組活動線程,用於分析瓶頸和死鎖情況。 我們可以使用探查器,kill-3命令,jstack工具等生成線程轉儲。

20.什麼是僵局? 如何分析和避免僵局?

死鎖是線程永遠被阻塞的情況。 當兩個或多個線程訪問彼此依賴的同一資源時,會發生這種情況。 換句話說,沒有一個線程被執行,其中一個線程等待已經處於等待狀態的另一個線程執行。

我們可以通過查看線程轉儲並蒐索處於BLOCKED狀態的線程來分析死鎖情況。

通過避免使用嵌套鎖,無限等待以及僅鎖定所需的內容,我們可以避免死鎖。

21. wait()和sleep()方法有什麼區別?

wait()方法是 對像類別 並且用於釋放鎖,而sleep()方法是Thread類的一部分,並且不釋放任何鎖。

22.什麼是join()方法?

join()方法等待當前執行的任務停止執行,直到它加入完成的任務列表為止。 換句話說,它等待線程進入終止狀態。

23.什麼是線程間通信?

線程間通信是同步線程之間的通信過程,用於避免線程輪詢。 當一個線程在臨界狀態下暫停執行並允許另一個線程以相同的臨界狀態進入執行時,此功能很有用。

24.進程和線程之間有什麼區別?

過程
流程是正在執行的程序線程是進程的子集
進程維護不同的地址空間線程保持相同的地址
上下文切換較慢上下文切換更快
進程間通信較慢線程間通訊更快
父進程中的任何更改都不會影響子進程父線程中的任何更改都會影響子線程

25.什麼是關機鉤?

關閉掛鉤是JVM隱式調用的線程,用於在正常或突然關閉JVM之前清理資源。

26.我們什麼時候可以中斷線程?

當我們希望線程從睡眠或等待狀態喚醒時,我們可以中斷線程。 我們可以通過調用引發InterruptedExeception的interrupt()方法來做到這一點。

27.什麼是同步?

同步是控制多個線程對共享資源的訪問的過程。 換句話說,當一個線程使用共享資源時,它將鎖定它,以便另一個線程在釋放鎖之前不能使用它。 這非常重要,因為如果多個線程嘗試同時執行同一任務,則可能導致錯誤。 為避免此問題,Java引入了同步概念。

我們可以通過以下三種方式實現同步:

  • 通過同步方式
  • 同步塊
  • 靜態同步

28.什麼是比賽條件?

爭用條件是一個嚴重的問題,這是由於不正確地使用同步而導致的,其中多個線程同時執行同一任務。

29.什麼是線程池?

線程池代表一組正在等待任務的線程。 服務提供者一次拉一個線程並為其分配任務。 一旦完成,線程將再次返回到線程池。 使用線程池,我們可以實現更好的系統穩定性和更好的性能。

30.並發API的主要組件是什麼?

可以使用下面列出的Concurrency包的各種類和接口來實現Concurrency API:

  • 執行者
  • 執行器服務
  • 預定執行器服務
  • 未來
  • 時間單位
  • 線程工廠
  • 延遲隊列
  • 阻塞隊列
  • 信號
  • 移相器
  • 循環屏障
  • 倒計時鎖存器
  • FarkJoin游泳池

31.並發API中的Executor接口是什麼?

Executor接口用於執行特定任務。 它屬於java.util.concurrent包,其中包含execute()方法。

32.什麼是BlockingQueue?

BlockingQueue是Qu​​eue接口的子接口,其中包含一些方法,這些方法在插入新值之前等待可用空間,並在獲取值之前等待隊列變為非空。

33. Java Callable和Runnable接口有什麼區別?

Java Callable和Runnable接口均用於執行多個任務。 以下是區別:

可調用的界面可運行的界面
返回一個值不返回任何值
拋出CheckedException不拋出CheckedException
在Java 5之前不可用Java 5之前可用

34.什麼是並發中的原子動作?

原子動作是一種執行單個任務而不受其他方法干擾的操作。 它是並發包的一部分。 一旦原子動作開始,我們就無法在其間停止或暫停它。 我們需要等待,直到它完成所有動作。 基本變量和易失變量的所有區域和寫入操作都是原子操作。

35.什麼是並發中的鎖定接口?

鎖定接口用於實現同步。 它類似於同步塊,但差別不大。 鎖接口包含lock()和unlock()方法,並保證線程等待執行的順序。 此外,它還支持超時操作。

36.什麼是ExecutorService接口?

ExecutorService接口是Executor接口的子接口,它具有特殊功能來管理 生命週期.

37.同步編程和異步編程有什麼區別?

在同步編程中,當線程開始處理任務時,僅當分配的任務完成後,該線程才可用於其他任務。

在異步編程中,多個線程可以執行同一任務。

38. start和run方法有什麼區別?

start方法創建一個新線程,並在內部調用run方法以執行新線程的代碼

run方法為現有線程執行代碼。

39. notify()和notifyAll()方法有什麼區別?

notify()方法取消阻塞單個等待線程,而notifyAll()方法則解鎖所有等待線程。

40.考慮有3個線程T1,T2和T3。 我們如何確保T2在T1之後運行,而T3在T2之後運行?

這是有關多線程的常見面試問題之一。 答案是,我們可以使用join()方法確保這一點。

結論

在本教程中,我們涵蓋了熱門的Java多線程問題,有關多線程的採訪問題,Java線程採訪問題,多線程Java採訪問題,Java多線程問題,Java並發採訪問題。