1. 程式人生 > >自己實戰整理面試題--多執行緒(帶答案,不斷更新)

自己實戰整理面試題--多執行緒(帶答案,不斷更新)

一個執行緒兩次呼叫 start() 方法會出現什麼情況?執行緒的生命週期,狀態是如何轉移的?

Java 的執行緒是不允許啟動兩次的,第二次呼叫必然會丟擲 IllegalThreadStateException,這是一種執行時異常,多次呼叫 start 被認為是程式設計錯誤。

關於執行緒生命週期的不同狀態,在 Java 5 以後,執行緒狀態被明確定義在其公共內部列舉型別 java.lang.Thread.State 中,分別是:

新建(NEW),表示執行緒被創建出來還沒真正啟動的狀態,可以認為它是個 Java 內部狀態。

就緒(RUNNABLE),表示該執行緒已經在 JVM 中執行,當然由於執行需要計算資源,它可能是正在執行,也可能還在等待系統分配給它 CPU 片段,在就緒佇列裡面排隊。

在其他一些分析中,會額外區分一種狀態 RUNNING,但是從 Java API 的角度,並不能表示出來。

阻塞(BLOCKED),這個狀態和我們前面兩講介紹的同步非常相關,阻塞表示執行緒在等待 Monitor lock。比如,執行緒試圖通過 synchronized 去獲取某個鎖,但是其他執行緒已經獨佔了,那麼當前執行緒就會處於阻塞狀態。

等待(WAITING),表示正在等待其他執行緒採取某些操作。一個常見的場景是類似生產者消費者模式,發現任務條件尚未滿足,就讓當前消費者執行緒等待(wait),另外的生產者執行緒去準備任務資料,然後通過類似 notify 等動作,通知消費執行緒可以繼續工作了。Thread.join() 也會令執行緒進入等待狀態。

計時等待(TIMED_WAIT),其進入條件和等待狀態類似,但是呼叫的是存在超時條件的方法,比如 wait 或 join 等方法的指定超時版本,如下面示例:

public final native void wait(long timeout) throws InterruptedException;
終止(TERMINATED),不管是意外退出還是正常執行結束,執行緒已經完成使命,終止執行,也有人把這個狀態叫作死亡。
在第二次呼叫 start() 方法的時候,執行緒可能處於終止或者其他(非 NEW)狀態,但是不論如何,都是不可以再次啟動的。


執行緒的阻塞的方式
wait,sleep分別是誰的方法,區別?
JDK 中有哪幾個執行緒池?順帶把執行緒池講了個遍
多執行緒的常用方法和介面類及執行緒池的機制
程序和執行緒的區別?
程序之間如何保證同步?
如何保證執行緒安全問題?

Synchronized關鍵字原理?

volatile 原理?volatile的用途
volatile 的原子性問題?為什麼 i++支援原子性?從計算機原理的設計來講下不能保證原子性的原因
happens before 原理
程序的狀態轉化(程序的三種狀態間的基本轉換)。
(Java後端技術公眾號)
執行緒和程序的概念、並行和併發的概念
建立執行緒的方式及實現
程序間通訊的方式
說說 CountDownLatch、CyclicBarrier 原理和區別
說說 Semaphore 原理
說說 Exchanger 原理
countLatch的await方法是否安全,怎麼改造

說說執行緒安全問題,什麼實現執行緒安全,如何實現執行緒安全;
建立執行緒池有哪幾個核心引數? 如何合理配置執行緒池的大小?

ThreadLocal原理,注意事項,引數傳遞
ThreadLocal的使用場景和原理;

ThreadLocal 原理分析,ThreadLocal為什麼會出現OOM,出現的深層次原理
ThreadLocal什麼時候會出現OOM的情況?為什麼?

threadlocal使用時注意的問題(ThreadLocal和Synchonized都用於解決多執行緒併發訪問。但是ThreadLocal與synchronized有本質的區別。synchronized是利用鎖的機制,使變數或程式碼塊在某一時該只能被一個執行緒訪問。而ThreadLocal為每一個執行緒都提供了變數的副本,使得每個執行緒在某一時間訪問到的並不是同一個物件,這樣就隔離了多個執行緒對資料的資料共享。而Synchronized卻正好相反,它用於在多個執行緒間通訊時能夠獲得資料共享)

java執行緒池

執行緒池引數,整個流程描述

執行緒池的原理,為什麼要建立執行緒池?建立執行緒池的方式,執行緒池的幾種實現方式
什麼時候會出現僵死程序?
可參考:《Java多執行緒程式設計核心技術》
為什麼執行緒執行要呼叫start而不是直接run(直接run,跟普通方法沒什麼區別,先調start,run才會作為一個執行緒方法執行)
java的concurrent包用過沒,Java 併發包原理?

aqs,cas?
原子類,執行緒安全的物件,異常的處理方式
可重入鎖中對應的wait和notify
java執行緒池中基於快取和基於定長的兩種執行緒池,當請求太多時分別是如何處理的?定長的事用的佇列,如果佇列也滿了呢?交換進磁碟?基於快取的執行緒池解決方法呢?