1. 程式人生 > >面試之線程

面試之線程

bool 類對象 article 判斷 一個 否則 true ads finall

一、JDK、JRE和JVM三者之間關系:  

1、所有的JAVA程序都會被編譯成class文件,由虛擬機JVM和操作系統交互
2、JVM需要調用解釋所需要的類庫lib才可以執行class文件,JVM+lib=JRE即JAVA運行環境
3、JDK主要用於程序開發,最主要是編譯器,包含了JRE,JAVA工具類和JAVA基礎類庫

二、怎麽實現線程

實現Runnable接口或者繼承Thread類來實現,當你打算多重繼承時,優先選擇實現Runnable

三、Thread.start()與Thread.run()有什麽區別

調用start()後,線程會被放到等待隊列,等待CPU調度。然後通過JVM,線程Thread會調用run()方法,執行本線程的線程體

四、為什麽需要run()和start()方法,我們可以只用run()方法來完成任務嗎

start()用來啟動一個線程,當調用start()方法時,系統才會開啟一個線程。run()只是一個線程裏的一個函數,和多線程無關

 1 public synchronized void start() {
 2         if (threadStatus != 0)
 3             throw new IllegalThreadStateException();
 4         group.add(this);
 5 
 6         boolean started = false
; 7 try { 8 start0(); 9 //private native void start0(),使用native修飾,Thread類要調用本地方法,要向JVM註冊,這個方法調用了run方法 10 started = true; 11 } finally { 12 try { 13 if (!started) { 14 group.threadStartFailed(this); 15 }
16 } catch (Throwable ignore) { 17 } 18 } 19 }

五、什麽是ThreadLocal類,怎麽使用它

通常情況下,我們創建的變量是可以被任何一個線程訪問並修改的。而使用ThreadLocal創建的變量只能被當前線程訪問,其他線程則無法訪問和修改

六、什麽時候拋出InvalidMonitorStateException異常,為什麽

調用wait()/notify()/notifyAll()中的任何一個方法時,如果當前線程沒有獲得該對象 的鎖,那麽就會拋出IllegalMonitorStateException的異常

七、多線程中sleep、supend和wait區別

共同點:都會阻塞當前線程

不同點:

  1、sleep不會交出任何已獲得的對象鎖,是Thread類的方法,是線程用來控制自身流程的,調用此方法要捕捉InterruptedException異常

  2、wait會交出調用wait對象的對象鎖。是Object類中定義的方法,用來線程間的通信,而且wait存在notify方法來喚醒調用wait的線程。

  3、suspend,使線程進入停滯狀態,除非收到resume消息,否則該線程不會變回可執行狀態

八、多線程中wait/notify區別

1、wait() 與 notify/notifyAll 方法必須在同步代碼塊中使用

  wait() 與 notify/notifyAll() 是Object類的方法,在執行兩個方法時,要先通過synchronized[‘s??kr?na?zd]獲得鎖

2、notify/notifyAll()執行後,並不立即釋放鎖,而是要等到執行完臨界區中代碼後,再釋放

3、多線程中測試某個條件的變化用 if 還是用 while?

List中沒有數據了,再還是有線程去執行刪除數據的操作。因此,需要用while循環來判斷條件的變化,而不是用if

九、在靜態方法上使用同步時會發生什麽事

Synchronized修飾靜態方法,實際上是對該類對象加鎖,俗稱“類鎖”

答案:http://blog.csdn.net/u010842515/article/details/65443084

十、Thread的join方法

1、Thread類中的join方法的主要作用就是同步,它可以使得線程之間的並行執行變為串行執行

2、join方法必須在線程start方法調用之後調用才有意義

3、join方法的原理就是調用相應線程的wait方法進行等待操作的,例如A線程中調用了B線程的join方法,則相當於在A線程中調用了B線程的wait方法,當B線程執行完(或者到達等待時間),B線程會自動調用自身的notifyAll方法喚醒A線程,從而達到同步的目的

十一、死鎖

形成原因:循環等待,多線程申請多資源,形成了循環等待

1、互斥:進程在某一時間內獨占資源;
2、持有:一個進程因請求資源而阻塞時,對已獲得的資源保持不放;
3、不可剝奪:進程已獲得資源,在末使用完之前,不能強行剝奪;
4、環形等待:若幹進程之間形成一種頭尾相接的循環等待資源關系;

解決方法:

1、針對2和3,引入事務機制,將所有上鎖操作均作為事務對待,一旦開始上鎖,即確保全部操作均可回退,同時通過鎖管理器檢測死鎖,並剝奪資源

2、針對4,約定上鎖的順序必須一致

3、在嘗試獲取鎖的時候加一個超時時間

4、死鎖檢測機制

每當一個線程獲得了鎖,會在線程和鎖相關的數據結構中(map、graph等等)將其記下。除此之外,每當有線程請求鎖,也需要記錄在這個數據結構中。
當一個線程請求鎖失敗時,這個線程可以遍歷鎖的關系圖看看是否有死鎖發生。

面試之線程