JAVA多執行緒常見面試問題解析

2021-08-10 08:14:06 字數 1426 閱讀 9465

1.繼承thread類,重寫他的run方法。thread類其自身其實也是乙個實現了runnable介面的例項,通過thread類的start()方法啟動該執行緒的唯一方式;

2.實現runnable介面,然後去實現他的run()方法。使用方法是,建立乙個thread物件,然後用實現的runnable介面的類作為thread物件的例項化引數,然後呼叫此物件的start()方法;

3.實現callable介面,重寫call方法。這個介面我用的比較少,內容是從網上找的,希望大家不要噴。callable介面與runnable介面的功能類似,但他有以下三點是runnable介面所沒有的。

1).callable可以在任務結束後提供乙個返回值;

2).callable中的call()方法是可以丟擲異常的;

3).執行實現callable介面的物件可以拿到乙個future物件,該物件儲存的是非同步計算的結果,用他作為檢查計算是否完成的方法。

start()方法是例項化執行緒後去啟動該執行緒,而run()方法是執行緒中具體的操作方法。

如果直接呼叫執行緒的run()方法,程式只會當他是乙個普通的函式去執行,並沒有給他開闢執行緒。如果要使程式為他單獨開發執行緒,則需要呼叫該例項化執行緒的start()方法。

sleep()方法的作用是要求執行緒暫停一段時間,等到倒計時時間到達後會繼續執行後面的**,在此過程中線程並不會釋放所占用的資源和鎖。但是當程式呼叫wait()方法後,執行緒進入等待狀態,此時執行緒會釋放掉所占用物件的資源和鎖,只有其他執行緒呼叫該執行緒的notify()方法,執行緒才會被喚醒。

synchronized關鍵字是執行緒中或者其他**中用於做同步的關鍵字。可以加到方法上,叫做同步方法。可以加到一塊**上,叫做同步**塊。

例如:同步方法: public synchronized void function(){}

同步**塊:synchronized(object){}

當某個資源或者物件被synchronized關鍵字修飾後,此時如果多個執行緒同時請求該資源,那麼多個執行緒必須排隊等待,必須先到的執行緒使用結束後其他執行緒才可執行。

例如:執行緒1和執行緒2兩個執行緒在同時請求乙個資源,執行緒1的請求先到達,執行過程中,呼叫wait()方法釋放了物件的鎖,此時執行緒2獲得該物件的鎖,執行緒2使用結束後,呼叫了物件的notify()方法,喚醒了等待中的執行緒1,此時執行緒1重新獲得該物件的資源,繼續執行其他操作。當然執行緒2也可以呼叫notifyall()方法,喚醒等待佇列中的所有執行緒。

執行緒使用的過程中需要注意的地方有以下幾點:

1).當正在執行的執行緒呼叫nofity()方法喚醒其他執行緒後,並不代表被喚醒的執行緒就立即獲得了該資源物件的鎖,必須等待上乙個執行緒執行完同步方法或者同步**塊中的內容並釋放掉物件鎖後,被喚醒的物件才會獲得該資源的物件鎖。

2).在使用synchronized關鍵字修飾方法或者**塊時,一定要注意實際應用過程中的同步範圍,一般在需要加鎖同步的過程中盡量縮小同步的範圍。因為同步的範圍越大,效能也就越差。

SVM常見面試問題

答 幾何間隔與樣本的誤分次數間存在關係 其中的分母就是樣本到分類間隔距離,分子中的r是所有樣本中的最長向量值 答 會,超平面會靠近樣本少的類別。因為使用的是軟間隔分類,而如果對所有類別都是使用同樣的懲罰係數,則由於優化目標裡面有最小化懲罰量,所以靠近少數樣本時,其懲罰量會少一些。比如 假設理想的分隔...

C 常見面試問題

一 抽象與介面的區別 1,抽象 abstract 1 抽象類中可以有抽象方法,也可沒有 2 抽象方法包含實現,也可以由子類實現 3 抽象類不能被sealed修飾,只能使用abstract關鍵字 4 抽象方法不能在抽象類外部宣告 5 抽象類只能單繼承 6 可以有虛方法 virtual 在不同的繼承中,...

SpringMVC 常見面試問題

springmvc流程 原理 流程圖 亂碼問題 重定向和 在返回值前面加 redirect 或 forward return forward 跳轉的頁面或路由 重定向和 的區別 全域性異常 自定義實現spring的全域性異常解析器handlerexceptionresolver springboot...