多線程基礎

1. 進程和線程之間有什么不同?

  • 一個進程是一個獨立的運行環(huán)境, 它可以被看作一個程序或者一個應用. 而線程是在進程中執(zhí)行一個任務. Java運行環(huán)境是一個包含了不同類和程序的單一進程. 線程可以以被成為輕量級進程. 線程需要較少的資源來創(chuàng)建和駐留在進程中, 并且可以共享進程中的資源.

2. 多線程編程的好處是什么?

  • 在多線程程序中, 多個線程并發(fā)的執(zhí)行以提高程序的效率, CPU不會因為某個線程需要等待資源而進入空閑狀態(tài). 多個線程共享堆內存,因此創(chuàng)建多線程去執(zhí)行一些任務會嗶創(chuàng)建多個進程更好. 舉個栗子, Servlet比CGI更好, 因為Servlet支持多線程而CGI不支持.

3. 用戶線程和守護線程有什么區(qū)別?

  • 當我們在Java程序中創(chuàng)建一個線程, 它就被成為用戶線程. 一個守護線程是在后臺執(zhí)行并且不會阻止JVM終止的線程. 當沒有用戶線程在運行的時候, JVM關閉程序并且退出. 一個守護線程創(chuàng)建的自線程依然是守護線程 setDaemon(true)

4. 如何創(chuàng)建一個線程?

  1. 實現(xiàn)Runnable接口, 然后將他傳遞給Thread的構造函數, 創(chuàng)建一個Thread對象
  2. 直接繼承Thread

5. 有哪些不同的線程生命周期?

  • 當我們在Java程序中創(chuàng)建一個新的線程時, 它的狀態(tài)是New, 當我們調用線程的start()方法時, 狀態(tài)改變?yōu)?em>Runnable, 線程調度器會為Runnable線程池中的線程分配CPU時間并且將他們的狀態(tài)改變?yōu)?em>Running. 其他的線程狀態(tài)還有Waitng, Blocked, 和Dead

6. 可以直接調用Thread類的run()方法嗎?

  • 可以, 但是如果我們調用了Threadrun()方法, 它的行為就會和普通的方法一樣, 為了在新的線程執(zhí)行我們的代碼, 必須使用Thread.start()方法

7. 如何讓正在運行的線程暫停一段時間?

  • 可以使用Thread.sleep()方法讓線程暫停一段時間. 需要注意的是, 這并不會讓線程終止, 一旦從休眠中喚醒線程, 線程的狀態(tài)將會被改變?yōu)?em>Runnable, 并且根據線程調度, 它將得到執(zhí)行

8. 你對線程優(yōu)先級的理解是什么?

  • 每一個線程都是有優(yōu)先級的, 一般來說, 高優(yōu)先級的線程在運行時會具有優(yōu)先權, 但這依賴于線程調度的實現(xiàn), 這個實現(xiàn)是和操作系統(tǒng)相關的. 我們可以定義線程的優(yōu)先級getPriority() setPriority(), 但是這并不能保證高優(yōu)先級的線程會在低優(yōu)先級的線程前執(zhí)行. 縣城優(yōu)先級是一個int變量, 1代表最低, 10代表最高

9. 什么是線程調度器(Thread Scheduler)和時間分片(Time Slicing)?

  • 線程調度器是一個操作系統(tǒng)服務, 它負責為Runnable狀態(tài)的線程分配CPU時間, 一旦我們創(chuàng)建一個線程并啟動它, 它的執(zhí)行便依賴于線程調度器的實現(xiàn). 時間分片是指將可用的CPU時間分配給可用的Runnable線程的過程. 分配的CPU時間可以基于線程的優(yōu)先級或者線程的等待時間, 線程調度并不受到Java虛擬機控制, 所以由應用程序來控制它是更好的選擇(也就是說不要讓你的程序依賴于線程優(yōu)先級)

10. 在多線程中, 什么是上下文切換?

  • 上下文切換是存儲和回復CPU狀態(tài)的過程, 它使得線程執(zhí)行能夠從中斷點回復執(zhí)行.上下文切換是多任務操作系統(tǒng)和多線程環(huán)境的基本特征.

11. 如何確保main()方法所在的線程是Java程序最后結束的線程?

  • 我們可以使用Thread類的joint()方法來確保所有程序創(chuàng)建的線程在main()方法退出前結束.

12. 線程之間是如何通信的?

  • 當線程間是可共享資源時, 線程間通信是協(xié)調他們的重要手段. Object類中wait()/notify()/notifyAll()方法可以用于線程間通信關于資源的鎖的狀態(tài)

13. 為什么線程通信的方法wait()/notify()/notifyAll()被定義在Object類里?

  • Java中每個對象中都有一個鎖(monitor, 也稱為監(jiān)視器) 并且wait()/notify()/notifyAll()方法用于等待對象的鎖或者通知其他線程對象的監(jiān)視器可用. 在Java線程中并沒有可供任何對象使用的鎖和同步器. 這就是為什么這些方法是Object類的一部分, 這樣Java的每一個類都有用于線程間通信的基本方法.

14. 為什么wait()/notify()/notifyAll()必須在同步方法或者同步塊中被調用?

  • 當一個線程需要調用對象的wait()方法的時候, 這個線程必須擁有該對象的鎖, 接著它就會釋放這個對象鎖并進入等待狀態(tài)知道其他線程調用這個對象的notify()方法時, 它會釋放這個對象的鎖, 以便其他在等待的線程可以得到這個對象鎖. 由于所有的這些方法都需要線程持有對象的鎖, 這樣就只能通過同步來實現(xiàn), 所以他們只能在同步方法或者同步塊中被調用.

15. 為什么Thread類的sleep()yield()方法是靜態(tài)的?

  • Thread類的sleep()yield()方法將在當前正在執(zhí)行的線程上運行, 所以在其他處于等待狀態(tài)的線程上調用這些方法是沒有意義的, 這就是為什么這些方法是靜態(tài)的. 他們可以在當前正在執(zhí)行的線程中工作, 避免程序員錯誤的認為可以在其他非運行線程調用這些方法.

16. 如何確保線程安全?

  • 在Java中可以有很多方法來保證線程安全---同步, 使用原子類(atomic concurrent classes), 實現(xiàn)并發(fā)鎖, 使用volatile關鍵字, 使用不變類和線程安全類

17. volatile關鍵字在Java中有什么作用?

  • 當我們使用volatile關鍵字去修飾變量的時候, 所有線程都會直接讀取該變量并且不緩存它, 這就確保了線程讀取到的變量是同內存中一致的.

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

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

19. 如何創(chuàng)建守護線程?

  • 使用Thread類的setDaemon(true)方法可以講線程設置為守護線程, 需要注意的是, 需要在調用start()方法前調用這個方法, 否則會拋出IllegalThreadStateException異常.

20. 什么是ThreadLocal?

  • ThreadLocal用于創(chuàng)建線程的本地變量, 我們知道一個獨享的所有線程會共享它的全局變量, 所以這些變量不是線程安全的, 我們可以使用同步技術,. 但當我們不想使用同步的時候, 我們可以選擇ThreadLocal變量.

  • 每個線程都會擁有他們自己的Thread變量, 它們可以使get()/set()方法獲取他們的默認值或者在線程內部改變他們的值, ThreadLocal實例通常是希望他們

同線程狀態(tài)關聯(lián)起來是private static屬性.

21. 什么是ThreadGroup? 為什么不建議使用它?

  • ThreadGroup是一個類, 它的目的是提供關于線程組的信息.

  • ThreadGroup API比較薄弱, 它并沒有嗶Thread提供了更多的功能. 它主要有兩個功能: 一是獲取縣城組中處于活躍狀態(tài)線程的列表; 二是甚至為線程設置未捕獲異常處理器(uncaught exception handler) . 但在java 1.5中Thread類也添加了setUncaughtExceptionHandler(UncaughtExceptionHandler eh)方法, 所以ThreadGroup是已經過時的, 不建議使用.

22. 什么是死鎖(Deadlock)? 如何分析和避免死鎖?

  • 死鎖是指兩個線程永遠阻塞的情況, 這種情況產生至少需要兩個以上的線程和兩個以上的資源.
  • 分析死鎖, 我們需要查看Java應用程序的線程轉儲, 我們需要找出那些狀態(tài)為Blocked的線程和他們等待的資源. 每個資源都有 一個唯一的id, 用這個id我們可以找出哪些線程已經擁有了它的對象鎖.
  • 避免嵌套鎖, 只在需要的地方使用鎖和避免無限期等待是避免死鎖的通常方法.

23. 什么是Java Timer類?如何創(chuàng)建一個有特定時間間隔的任務?

  • java.util.Timer是一個工具類, 可以用于安排一個線程在未來的某個特定時間執(zhí)行. Timer類可以用安排一次性任務或者周期性任務.
  • java.util.TimerTask是一個實現(xiàn)了Runnable接口的抽象類, 我們需要去繼承這個類來創(chuàng)建我們自己的定時任務并使用Timer安排它的執(zhí)行.

24. 什么是線程池?如何創(chuàng)建一個Java線程池?

  • 一個線程池管理了一組工作線程, 同時它還包括了一個用于放置等待執(zhí)行的任務的隊列.
  • java.util.concurrent.Executors提供了一個java.util.concurrent.Executor接口用于創(chuàng)建線程池.
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末沧侥,一起剝皮案震驚了整個濱河市解寝,隨后出現(xiàn)的幾起案子统诺,更是在濱河造成了極大的恐慌,老刑警劉巖施绎,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡遇西,警方通過查閱死者的電腦和手機灭衷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門次慢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人翔曲,你說我怎么就攤上這事迫像。” “怎么了瞳遍?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵闻妓,是天一觀的道長。 經常有香客問我傅蹂,道長纷闺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任份蝴,我火速辦了婚禮犁功,結果婚禮上,老公的妹妹穿的比我還像新娘婚夫。我一直安慰自己浸卦,他們只是感情好,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布案糙。 她就那樣靜靜地躺著限嫌,像睡著了一般靴庆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上怒医,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天炉抒,我揣著相機與錄音,去河邊找鬼稚叹。 笑死焰薄,一個胖子當著我的面吹牛,可吹牛的內容都是我干的扒袖。 我是一名探鬼主播塞茅,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼季率!你這毒婦竟也來了野瘦?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤飒泻,失蹤者是張志新(化名)和其女友劉穎鞭光,沒想到半個月后,有當地人在樹林里發(fā)現(xiàn)了一具尸體蠢络,經...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡衰猛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了刹孔。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片啡省。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖髓霞,靈堂內的尸體忽然破棺而出卦睹,到底是詐尸還是另有隱情,我是刑警寧澤方库,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布结序,位于F島的核電站,受9級特大地震影響纵潦,放射性物質發(fā)生泄漏徐鹤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一邀层、第九天 我趴在偏房一處隱蔽的房頂上張望返敬。 院中可真熱鬧,春花似錦寥院、人聲如沸劲赠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽凛澎。三九已至霹肝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間塑煎,已是汗流浹背沫换。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留轧叽,地道東北人苗沧。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓刊棕,卻偏偏與公主長得像炭晒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子甥角,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內容

  • 寫在前面的話: 這篇博客是我從這里“轉載”的网严,為什么轉載兩個字加“”呢?因為這絕不是簡單的復制粘貼嗤无,我花了五六個小...
    SmartSean閱讀 4,732評論 12 45
  • 前言 多線程并發(fā)編程是Java編程中重要的一塊內容震束,也是面試重點覆蓋區(qū)域,所以學好多線程并發(fā)編程對我們來說極其重要...
    嘟爺MD閱讀 7,315評論 21 272
  • 為什么使用多線程 可以最大限度地利用CPU的空閑時間來處理其它任務当犯。異步處理不同的任務垢村,提高任務處理效率。 線程的...
    零度沸騰_yjz閱讀 369評論 0 4
  • 簡餐Look 配料: 雞蛋,西紅柿拓诸,蘆筍侵佃,酸奶,時令水果奠支,奧利奧馋辈,薄荷葉,醬油 用時:十分鐘 準備工作:西紅柿切丁...
    Matcha加牛奶閱讀 357評論 0 4
  • 我們總是會遇到一些人倍谜,他們非常在意別人對他的看法迈螟,他們活在別人的眼中,如果別人是友善的眼神尔崔,他們就會比較舒服答毫,如果...
    多杰卓瑪閱讀 199評論 0 0