史上最全Java多執行緒面試題,附答案

胖胖胖胖虎阿發表於2021-10-26

我把所有Java相關的面試題和答案都整理成了PDF,並且帶書籤目錄,閱讀起來非常方便

面試題及答案PDF下載https://www.hicxy.com/2645.html

面試題及答案PDF下載https://www.hicxy.com/2645.html

面試題及答案PDF下載https://www.hicxy.com/2645.html

1. 多執行緒和單執行緒的區別和聯絡?

1、 在單核 CPU 中,將 CPU 分為很小的時間片,在每一時刻只能有一個執行緒在執行,是一種微觀上輪流佔用 CPU 的機制。

2、 多執行緒會存線上程上下文切換,會導致程式執行速度變慢,即採用一個擁有兩個執行緒的程式執行所需要的時間比一個執行緒的程式執行兩次所需要的時間要多一些。

結論:即採用多執行緒不會提高程式的執行速度,反而會降低速度,但是對於使用者來說,可以減少使用者的響應時間。

2. 什麼是多執行緒中的上下文切換?

多執行緒會共同使用一組計算機上的CPU,而執行緒數大於給程式分配的CPU數量時,為了讓各個執行緒都有執行的機會,就需要輪轉使用CPU。不同的執行緒切換使用CPU發生的切換資料等就是上下文切換。

3. join方法的作用?

Thread類中的join方法的主要作用就是同步,它可以使得執行緒之間的並行執行變為序列執行。當我們呼叫某個執行緒的這個方法時,這個方法會掛起呼叫執行緒,直到被呼叫執行緒結束執行,呼叫執行緒才會繼續執行。

4. 建立執行緒池引數有哪些,作用?

public ThreadPoolExecutor(   int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler)

1.corePoolSize:核心執行緒池大小,當提交一個任務時,執行緒池會建立一個執行緒來執行任務,即使其他空閒的核心執行緒能夠執行新任務也會建立,等待需要執行的任務數大於執行緒核心大小就不會繼續建立。

2.maximumPoolSize:執行緒池最大數,允許建立的最大執行緒數,如果佇列滿了,並且已經建立的執行緒數小於最大執行緒數,則會建立新的執行緒執行任務。如果是無界佇列,這個引數基本沒用。

3.keepAliveTime: 執行緒保持活動時間,執行緒池工作執行緒空閒後,保持存活的時間,所以如果任務很多,並且每個任務執行時間較短,可以調大時間,提高執行緒利用率。

4.unit: 執行緒保持活動時間單位,天(DAYS)、小時(HOURS)、分鐘(MINUTES、毫秒MILLISECONDS)、微秒(MICROSECONDS)、納秒(NANOSECONDS)

5.workQueue: 任務佇列,儲存等待執行的任務的阻塞佇列。

一般來說可以選擇如下阻塞佇列:

ArrayBlockingQueue:基於陣列的有界阻塞佇列。

LinkedBlockingQueue:基於連結串列的阻塞佇列。

SynchronizedQueue:一個不儲存元素的阻塞佇列。

PriorityBlockingQueue:一個具有優先順序的阻塞佇列。

6.threadFactory:設定建立執行緒的工廠,可以通過執行緒工廠給每個建立出來的執行緒設定更有意義的名字。

7.handler: 飽和策略也叫拒絕策略。當佇列和執行緒池都滿了,即達到飽和狀態。所以需要採取策略來處理新的任務。預設策略是AbortPolicy。

AbortPolicy:直接丟擲異常。


CallerRunsPolicy: 呼叫者所在的執行緒來執行任務。


DiscardOldestPolicy:丟棄佇列裡最近的一個任務,並執行當前任務。


DiscardPolicy:不處理,直接丟掉。


當然可以根據自己的應用場景,實現RejectedExecutionHandler介面自定義策略。

5. 舉例說明同步和非同步。

如果系統中存在臨界資源(資源數量少於競爭資源的執行緒數量的資源),例如正在寫的資料以後可能被另一個執行緒讀到,或者正在讀的資料可能已經被另一個執行緒寫過了,那麼這些資料就必須進行同步存取(資料庫操作中的排他鎖就是最好的例子)。當應用程式在物件上呼叫了一個需要花費很長時間來執行的方法,並且不希望讓程式等待方法的返回時,就應該使用非同步程式設計,在很多情況下采用非同步途徑往往更有效率。事實上,所謂的同步就是指阻塞式操作,而非同步就是非阻塞式操作。

後面的問題,大家可以先自己獨立思考一下。

另外我把所有Java相關的面試題和答案都整理出來了,給大家參考一下

面試題及答案PDF下載https://www.hicxy.com/2645.html

面試題及答案PDF下載https://www.hicxy.com/2645.html

面試題及答案PDF下載https://www.hicxy.com/2645.html

6. 如何建立執行緒池

7. 為什麼wait()方法和notify()/notifyAll()方法要在同步塊中被呼叫

8. 為什麼wait和notify方法要在同步塊中呼叫?

9. join方法實現原理

10. notify()和notifyAll()有什麼區別?

11. 為什麼wait, notify 和 notifyAll這些方法不在thread類裡面?

12. # 2、同步靜態方法

13. 當一個執行緒進入某個物件的一個synchronized的例項方法後,其它執行緒是否可進入此物件的其它方法?

14. 你對執行緒優先順序的理解是什麼?

15. 關閉執行緒池

16. 執行緒同步和互斥有幾種實現方法,都是什麼?

17. 什麼是Daemon執行緒?它有什麼意義?

18. synchronized鎖的是什麼?

19. 在Java中CycliBarriar和CountdownLatch有什麼區別?

20. wait 和 sleep 方法的不同?

21. 為什麼Thread類的sleep()和yield ()方法是靜態的?

22. Java中用到的執行緒排程演算法是什麼?

23. 現在有 T1、T2、T3 三個執行緒,你怎樣保證 T2 在 T1 執行完後執行,T3 在 T2 執行完後執 行?

24. 在Java中Executor、ExecutorService、Executors的區別?

25. 樂觀鎖和悲觀鎖的理解及如何實現,有哪些實現方式?

26. 如何停止一個正在執行的執行緒

27. ThreadLocal是什麼

28. 什麼是Java記憶體模型

29. 什麼是不可變物件,它對寫併發應用有什麼幫助?

30. 什麼是原子操作?在Java Concurrency API中有哪些原子類(atomic classes)?

31. ConcurrentHashMap的併發度是什麼

32. 說說自己是怎麼使用 synchronized 關鍵字,在專案中用到了嗎synchronized關鍵字最主要的三種使用方式:

33. Java中Semaphore是什麼?

34. 如何在兩個執行緒間共享資料?

35. 什麼是ThreadLocal變數?

36. 怎麼檢測一個執行緒是否擁有鎖?

37. 你如何在Java中獲取執行緒堆疊?

38. 如何合理的設定執行緒池

39. Synchronized 有幾種用法?

40. sleep方法和wait方法有什麼區別

41. 什麼是執行緒池?為什麼要使用它?

42. 一個執行緒執行時發生異常會怎樣?

43. 如何控制某個方法允許併發訪問執行緒的大小?

44. 使用者執行緒和守護執行緒有什麼區別?

45. 執行緒中斷是否能直接呼叫stop,為什麼?

46. Runnable介面和Callable介面的區別

47. ThreadLocal有什麼用

48. Java中堆和棧有什麼不同?

49. Java中如何獲取到執行緒dump檔案

50. 什麼是執行緒排程器(Thread Scheduler)和時間分片(Time Slicing)?

51. 不使用stop停止執行緒?

52. SynchronizedMap和ConcurrentHashMap有什麼區別?

53. 高併發、任務執行時間短的業務怎樣使用執行緒池?併發不高、任務執行時間長的業務怎樣使用執行緒池?併發高、業務執行時間長的業務怎樣使用執行緒池?

54. 你如何確保main()方法所在的執行緒是Java 程式最後結束的執行緒?

55. 同步方法和同步塊,哪個是更好的選擇?

56. 執行緒池作用

57. CopyOnWriteArrayList可以用於什麼應用場景?

58. 如何建立守護執行緒?以及在什麼場合來使用它?

59. 如何在兩個執行緒之間共享資料

60. synchronized和ReentrantLock的區別

61. Thread.sleep(0)的作用是什麼

62. 執行緒的sleep()方法和yield()方法有什麼區別?

63. 什麼是阻塞佇列?阻塞佇列的實現原理是什麼?如何使用阻塞佇列來實現生產者-消費者模型?

64. 在java中守護執行緒和本地執行緒區別?

65. 什麼是Executors框架?

66. 什麼是Java Timer 類?如何建立一個有特定時間間隔的任務?

67. 如何讓正在執行的執行緒暫停一段時間?

68. 什麼是自旋

69. Java中你怎樣喚醒一個阻塞的執行緒?

70. Java中的死鎖

71. start()方法和run()方法的區別

72. join與start呼叫順序問題

73. Java Concurrency API中的Lock介面(Lock interface)是什麼?對比同步它有什麼優勢?

74. 什麼是執行緒池? 為什麼要使用它?

75. 執行緒的建立方式

76. 說一說自己對於 synchronized 關鍵字的瞭解

77. 為什麼使用Executor框架?

78. 執行緒的狀態

79. 簡述執行緒、程式、程式的基本概念。以及他們之間關係是什麼?

80. # 5、同步物件例項

81. # 1、同步普通方法

82. Executor框架的主要成員

83. synchronized包括哪兩個jvm重要的指令?

84. Thread類中的yield方法有什麼作用?

85. 執行緒類的構造方法、靜態塊是被哪個執行緒呼叫的

86. 什麼是 FutureTask

87. volatile關鍵字的作用

88. 什麼是執行緒安全?

89. volatile 變數和 atomic 變數有什麼不同?

90. 為什麼wait(), notify()和notifyAll ()必須在同步方法或者同步塊中被呼叫?

91. 如何確保執行緒安全?

92. 什麼是併發容器的實現?

93. # 3、同步類

94. 如何避免死鎖和檢測

95. 為什麼使用Executor框架比使用應用建立和管理執行緒好?

96. wait()方法和notify()/notifyAll()方法在放棄物件監視器時有什麼區別

97. 講一下 synchronized 關鍵字的底層原理

98. Java中interrupted 和 isInterrupted方法的區別?

99. 什麼是可重入鎖(ReentrantLock)?

100. 執行緒池工作流程

101. Java中活鎖和死鎖有什麼區別?

102. 執行緒的狀態轉換?

103.

104. 什麼是 Callable 和 Future?

105. 執行緒有哪些基本狀態?

106. 為什麼我們呼叫start()方法時會執行run()方法,為什麼我們不能直接呼叫run()方法?

107. 請說出與執行緒同步以及執行緒排程相關的方法。

108. 什麼是阻塞(Blocking)和非阻塞(Non-Blocking)?

109. 什麼是阻塞式方法?

110. Java中的同步集合與併發集合有什麼區別?

111. 什麼是競態條件?你怎樣發現和解決競爭?

112. 常用的執行緒池模式以及不同執行緒池的使用場景?

113. 死鎖與活鎖的區別,死鎖與飢餓的區別?

114. Java中原子操作更新欄位類,Atomic包提供了哪幾個類?

115. 向執行緒池提交任務

116. join方法傳參和不傳參的區別?

117. # 4、同步this例項

118. 線上程中你怎麼處理不可控制異常?

119. 在多執行緒中,什麼是上下文切換(context-switching)?

120. 多執行緒有什麼用?

121. 同步方法和同步塊,哪個是更好的選擇

122. 為什麼程式碼會重排序?

123. Java中interrupted 和isInterruptedd方法的區別?

124. 什麼是執行緒安全

125. 並行和併發有什麼區別?

126. 自旋鎖的優缺點?

127. Java執行緒池中submit() 和 execute()方法有什麼區別?

128. 一個執行緒如果出現了執行時異常會怎麼樣

129. volatile 是什麼?可以保證有序性嗎?

130. ThreadLocal原理,使用注意點,應用場景有哪些?

131. 執行緒安全的級別

132. Java中notify 和 notifyAll有什麼區別?

相關文章