贏在面試之Java多線程(十一)

来源:http://www.cnblogs.com/peke/archive/2017/11/24/7892779.html
-Advertisement-
Play Games

121,什麼是線程? 線程是操作系統能夠進行運算調度的最小單位,它被包含在進程之中,是進程中的實際運作單位。程式員可以通過它進行多處理器編程,你可以使用多線程對運算密集型任務提速。比如,如果一個線程完成一個任務要100毫秒,那麼用十個線程完成改任務只需10毫秒。 122,線程和進程有什麼區別? 線程 ...


121,什麼是線程?

        線程是操作系統能夠進行運算調度的最小單位,它被包含在進程之中,是進程中的實際運作單位。程式員可以通過它進行多處理器編程,你可以使用多線程對運算密集型任務提速。比如,如果一個線程完成一個任務要100毫秒,那麼用十個線程完成改任務只需10毫秒。

 

122,線程和進程有什麼區別?

        線程是進程的子集,一個進程可以有很多線程,每條線程並行執行不同的任務。不同的進程使用不同的記憶體空間,而所有的線程共用一片相同的記憶體空間。每個線程都擁有單獨的棧記憶體用來存儲本地數據。

 

123,如何在Java中實現線程?

        兩種方式:java.lang.Thread 類的實例就是一個線程但是它需要調用java.lang.Runnable介面來執行,由於線程類本身就是調用的Runnable介面所以你可以繼承java.lang.Thread 類或者直接調用Runnable介面來重寫run()方法實現線程。

 

124,Java 關鍵字volatile 與 synchronized 作用與區別?

    1,volatile
    它所修飾的變數不保留拷貝,直接訪問主記憶體中的。
           在Java記憶體模型中,有main memory,每個線程也有自己的memory (例如寄存器)。為了性能,一個線程會在自己的memory中保持要訪問的變數的副本。這樣就會出現同一個變 量在某個瞬間,在一個線程的memory中的值可能與另外一個線程memory中的值,或者main memory中的值不一致的情況。 一個變數聲明為volatile,就意味著這個變數是隨時會被其他線程修改的,因此不能將它cache線上程memory中。
    2,synchronized

    當它用來修飾一個方法或者一個代碼塊的時候,能夠保證在同一時刻最多只有一個線程執行該段代碼。

         一、當兩個併發線程訪問同一個對象object中的這個synchronized(this)同步代碼塊時,一個時間內只能有一個線程得到執行。另一個線程必須等待當前線程執行完這個代碼塊以後才能執行該代碼塊。

         二、然而,當一個線程訪問object的一個synchronized(this)同步代碼塊時,另一個線程仍然可以訪問該object中的非synchronized(this)同步代碼塊。

         三、尤其關鍵的是,當一個線程訪問object的一個synchronized(this)同步代碼塊時,其他線程對object中所有其它synchronized(this)同步代碼塊的訪問將被阻塞。

         四、當一個線程訪問object的一個synchronized(this)同步代碼塊時,它就獲得了這個object的對象鎖。結果,其它線程對該object對象所有同步代碼部分的訪問都被暫時阻塞。

         五、以上規則對其它對象鎖同樣適用.

 

125,有哪些不同的線程生命周期?

        當我們在Java程式中新建一個線程時,它的狀態是New。當我們調用線程的start()方法時,狀態被改變為Runnable。線程調度器會為Runnable線程池中的線程分配CPU時間並且講它們的狀態改變為Running。其他的線程狀態還有Waiting,Blocked 和Dead

        

126,你對線程優先順序的理解是什麼?

        每一個線程都是有優先順序的,一般來說,高優先順序的線程在運行時會具有優先權,但這依賴於線程調度的實現,這個實現是和操作系統相關的(OS dependent)。我們可以定義線程的優先順序,但是這並不能保證高優先順序的線程會在低優先順序的線程前執行。線程優先順序是一個int變數(從1-10),1代表最低優先順序,10代表最高優先順序。

 

127,什麼是死鎖(Deadlock)?如何分析和避免死鎖?

        死鎖是指兩個以上的線程永遠阻塞的情況,這種情況產生至少需要兩個以上的線程和兩個以上的資源。

        分析死鎖,我們需要查看Java應用程式的線程轉儲。我們需要找出那些狀態為BLOCKED的線程和他們等待的資源。每個資源都有一個唯一的id,用這個id我們可以找出哪些線程已經擁有了它的對象鎖。

        避免嵌套鎖,只在需要的地方使用鎖和避免無限期等待是避免死鎖的通常辦法。

 

128,什麼是線程安全?Vector是一個線程安全類嗎? 

        如果你的代碼所在的進程中有多個線程在同時運行,而這些線程可能會同時運行這段代碼。如果每次運行結果和單線程運行的結果是一樣的,而且其他的變數的值也和預期的是一樣的,就是線程安全的。一個線程安全的計數器類的同一個實例對象在被多個線程使用的情況下也不會出現計算失誤。很顯然你可以將集合類分成兩組,線程安全和非線程安全的。Vector 是用同步方法來實現線程安全的, 而和它相似的ArrayList不是線程安全的。

 

129,Java中如何停止一個線程?

        Java提供了很豐富的API但沒有為停止線程提供API。JDK 1.0本來有一些像stop(), suspend() 和 resume()的控制方法但是由於潛在的死鎖威脅因此在後續的JDK版本中他們被棄用了,之後Java API的設計者就沒有提供一個相容且線程安全的方法來停止一個線程。當run() 或者 call() 方法執行完的時候線程會自動結束,如果要手動結束一個線程,你可以用volatile 布爾變數來退出run()方法的迴圈或者是取消任務來中斷線程

 

130,什麼是ThreadLocal?

        ThreadLocal用於創建線程的本地變數,我們知道一個對象的所有線程會共用它的全局變數,所以這些變數不是線程安全的,我們可以使用同步技術。但是當我們不想使用同步的時候,我們可以選擇ThreadLocal變數。

        每個線程都會擁有他們自己的Thread變數,它們可以使用get()\set()方法去獲取他們的預設值或者線上程內部改變他們的值。ThreadLocal實例通常是希望它們同線程狀態關聯起來是private static屬性。

 

131,Sleep()、suspend()和wait()之間有什麼區別?

        Thread.sleep()使當前線程在指定的時間處於“非運行”(Not Runnable)狀態。線程一直持有對象的監視器。比如一個線程當前在一個同步塊或同步方法中,其它線程不能進入該塊或方法中。如果另一線程調用了interrupt()方法,它將喚醒那個“睡眠的”線程。

        註意:sleep()是一個靜態方法。這意味著只對當前線程有效,一個常見的錯誤是調用t.sleep(),(這裡的t是一個不同於當前線程的線程)。即便是執行t.sleep(),也是當前線程進入睡眠,而不是t線程。t.suspend()是過時的方法,使用suspend()導致線程進入停滯狀態,該線程會一直持有對象的監視器,suspend()容易引起死鎖問題。

        object.wait()使當前線程出於“不可運行”狀態,和sleep()不同的是wait是object的方法而不是thread。調用object.wait()時,線程先要獲取這個對象的對象鎖,當前線程必須在鎖對象保持同步,把當前線程添加到等待隊列中,隨後另一線程可以同步同一個對象鎖來調用object.notify(),這樣將喚醒原來等待中的線程,然後釋放該鎖。基本上wait()/notify()與sleep()/interrupt()類似,只是前者需要獲取對象鎖。

 

132,什麼是線程餓死,什麼是活鎖?

        當所有線程阻塞,或者由於需要的資源無效而不能處理,不存在非阻塞線程使資源可用。JavaAPI中線程活鎖可能發生在以下情形:

        1,當所有線程在程式中執行Object.wait(0),參數為0的wait方法。程式將發生活鎖直到在相應的對象上有線程調用Object.notify()或者Object.notifyAll()。

        2,當所有線程卡在無限迴圈中。

 

133,什麼是Java Timer類?如何創建一個有特定時間間隔的任務?

        java.util.Timer是一個工具類,可以用於安排一個線程在未來的某個特定時間執行。Timer類可以用安排一次性任務或者周期任務。

        java.util.TimerTask是一個實現了Runnable介面的抽象類,我們需要去繼承這個類來創建我們自己的定時任務並使用Timer去安排它的執行。

 

 

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

        同步集合與併發集合都為多線程和併發提供了合適的線程安全的集合,不過併發集合的可擴展性更高。

        在Java1.5之前程式員們只有同步集合來用且在多線程併發的時候會導致爭用,阻礙了系統的擴展性。

        Java5介紹了併發集合像ConcurrentHashMap,不僅提供線程安全還用鎖分離和    內部分區等現代技術提高了可擴展性。

 

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

        同步塊是更好的選擇,因為它不會鎖住整個對象(當然你也可以讓它鎖住整個對象)。同步方法會鎖住整個對象,哪怕這個類中有多個不相關聯的同步塊,這通常會導致他們停止執行並需要等待獲得這個對象上的鎖。

 

136,什麼是線程池? 為什麼要使用它?

        創建線程要花費昂貴的資源和時間,如果任務來了才創建線程那麼響應時間會變長,而且一個進程能創建的線程數有限。

        為了避免這些問題,在程式啟動的時候就創建若幹線程來響應處理,它們被稱為線程池,裡面的線程叫工作線程。

        從JDK1.5開始,Java API提供了Executor框架讓你可以創建不同的線程池。比如單線程池,每次處理一個任務;數目固定的線程池或者是緩存線程池(一個適合很多生存期短的任務的程式的可擴展線程池)。

 

 

137,Java中invokeAndWait 和 invokeLater有什麼區別?

        這兩個方法是Swing API 提供給Java開發者用來從當前線程而不是事件派發線程更新GUI組件用的。InvokeAndWait()同步更新GUI組件,比如一個進度條,一旦進度更新了,進度條也要做出相應改變。如果進度被多個線程跟蹤,那麼就調用invokeAndWait()方法請求事件派發線程對組件進行相應更新。而invokeLater()方法是非同步調用更新組件的。

 

 

138,多線程中的忙迴圈是什麼?

        忙迴圈就是程式員用迴圈讓一個線程等待,不像傳統方法wait(), sleep() 或 yield() 它們都放棄了CPU控制,而忙迴圈不會放棄CPU,它就是在運行一個空迴圈。這麼做的目的是為了保留CPU緩存。

        在多核系統中,一個等待線程醒來的時候可能會在另一個內核運行,這樣會重建緩存。為了避免重建緩存和減少等待重建的時間就可以使用它了。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 自從出現了泛型和LINQ,對於集合的排序變得更簡單了。 //倒序 list.OrderByDescending(p=> p.a).ThenByDescending(p => p.b); //多個欄位順序排序 list.OrderBy(i => i.a).ThenBy(i => i.b); ...
  • 1 class Program 2 { 3 private static byte[] result = new byte[1024]; 4 static void Main(string[] args) 5 { 6 //設定伺服器IP地址 7 IPAddress ip = IPAddress.Pa ...
  • Nginx的匹配規則,很容易幫助我們劃分WCF服務的網段,從而實現企業數據信息系統多區域劃分,如小數據的微服務、傳輸數據文件的服務、即時通信服務、或者郵件服務,相當於構建了一條企業內部信息化的數據匯流排(DataBus)。Nginx的匹配原則能夠有效的分配URL,將流式數據分發給相應的服務處理,並且在... ...
  • 隨著微軟的開源,越來越多的項目支持跨平臺,但是各種支付平臺提供的類庫,又老又不支持跨平臺,吐槽下,尤其是微信,還有好多坑,於是ICanPay誕生了,今天就來講ICanPay是什麼,怎麼使用? ICanPay是一個支持多商戶多種支付方式的跨平臺網關處理類庫,使用ICanPay可以簡化訂單的創建、查詢、 ...
  • 支付回調: 獲取HttpRequest的body內容,之前使用Request.Form有時候數據請求不到(可能是跟.net core 版本有關?) 獲取到回調內容,接下來按照支付平臺來處理。 支付寶回調: 將返回的數據分割開來,decode後填裝到字典里後,獲取sign值等相關數據後,剔除sign及 ...
  • 在網站開發中,我們常常需要用到表單提交的方式,那麼在MVC中是如何獲取到表單中的數據呢?下麵我們來介紹以下幾種方式 首先我們先看看View前臺頁面 添加一個控制器 我們再看看前臺頁面的代碼 接下來我們進入正題,控制器如何去獲取表單代碼呢? 1.參數獲取,form表單中的name名稱要和action中 ...
  • 準備工作: 1.創建實體類:ClassInfo,預設想要對其按照班級學生數量進行排序 public class ClassInfo { /// <summary> /// 班級名稱 /// </summary> public string ClassName { get; set; } /// <s ...
  • 題目內容: 下圖為國內主要城市之間的公路里程: 你的程式要讀入這樣的一張表,然後,根據輸入的兩個城市的名稱,給出這兩個城市之間的里程。 註意:任何兩個城市之間的里程都已經給出,不需要計算經第三地中轉。 註意:你並不需要去錄入上圖的數據,數據是在程式輸入中給的。 輸入格式: 首先,你會讀到若幹個城市的 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...