第一章 Java多線程技能

1.實現多線程的兩種方式

繼承Thread類與實現Runnable接口。

2.獲取當前線程

Thread.currentThread獲取對象後可以使用getName()方法獲取線程名稱以及getId()方法獲取線程id等。

3.  一些基本API:isAlive(),sleep(),getId(),yield()等。

isAlive()測試線程是否處於活動狀態

sleep()讓“正在執行的線程”休眠

getId()取得線程唯一標識

yield()放棄當前的CPU資源

4.棄用的API

stop()停止當前線程。不會保證釋放當前線程佔有的資源。

該方法具有固有的不安全性。用 Thread.stop 來終止線程將釋放它已經鎖定的所有監視器(作爲沿堆棧向上傳播的未檢查 ThreadDeath 異常的一個自然後果)。如果以前受這些監視器保護的任何對象都處於一種不一致的狀態,則損壞的對象將對其他線程可見,這有可能導致任意的行爲。stop 的許多使用都應由只修改某些變量以指示目標線程應該停止運行的代碼來取代。目標線程應定期檢查該變量,並且如果該變量指示它要停止運行,則從其運行方法依次返回。如果目標線程等待很長時間(例如基於一個條件變量),則應使用 interrupt 方法來中斷該等待。

如果安裝了安全管理器,則以 this 作爲其參數調用 checkAccess 方法。這可能引發 SecurityException(在當前線程中)。

如果該線程不同於當前線程(即當前線程試圖終止除它本身以外的某一線程),則安全管理器的 checkPermission 方法(帶有RuntimePermission("stopThread") 參數)也會被調用。這會再次拋出 SecurityException(在當前線程中)。

無論該線程在做些什麼,它所代表的線程都被迫異常停止,並拋出一個新創建的 ThreadDeath 對象,作爲異常。

停止一個尚未啓動的線程是允許的。如果最後啓動了該線程,它會立即終止。

應用程序通常不應試圖捕獲 ThreadDeath,除非它必須執行某些異常的清除操作(注意,拋出 ThreadDeath 將導致 try 語句的 finally 子句在線程正式終止前執行)。如果 catch 子句捕獲了一個 ThreadDeath 對象,則重新拋出該對象很重要,因爲這樣該線程纔會真正終止。

對其他未捕獲的異常作出反應的頂級錯誤處理程序不會打印輸出消息,或者另外通知應用程序未捕獲到的異常是否爲 ThreadDeath 的一個實例

suspend()使線程暫停,但是不會釋放類似鎖這樣的資源。

該方法已經遭到反對,因爲它具有固有的死鎖傾向。如果目標線程掛起時在保護關鍵系統資源的監視器上保持有鎖,則在目標線程重新開始以前任何線程都不能訪問該資源。如果重新開始目標線程的線程想在調用resume 之前鎖定該監視器,則會發生死鎖。這類死鎖通常會證明自己是“凍結”的進程

resume()使線程恢復,如果之前沒有使用suspend暫停線程,則不起作用。

詳情查看http://blog.csdn.net/woaigaolaoshi/article/details/51298759

5. 線程的優先級:繼承性,規則性,隨機性

a.線程的優先級具有繼承性. 如,線程A啓動線程B,則B和A優先級一樣

b.線程的優先級具有規則性. CPU儘量傾向於把資源優先級高的線程

c.線程的優先級具有隨機性. 優先級不等同於執行順序,二者關係不確定

6. java中的兩種線程:用戶線程和守護(Daemon)線程

守護線程:進程中不存在非守護線程時,守護線程自動銷燬。典型例子如:垃圾回收線程。

7. 正確中斷線程的方法


在使用break時,由於break只是跳出循環,所以循環之後的內容還是會執行。所以建議使用異常法。同時,用return也能起到中斷效果。

8.辨析

a. interrupted()isInterrupted()

interrupted()是類的靜態方法,測試當前線程是否已經是中斷狀態,執行後具有將狀態標誌清除爲false的功能。

isInterrupted()是類的實例方法,測試Thread對象是否已經是中斷狀態,但不清楚狀態標誌。

b. sleep()和wait()區別:

  • sleep()是Thread類的static(靜態)的方法;wait()方法是Object類裏的方法
  • sleep()睡眠時,保持對象鎖,仍然佔有該鎖;wait()睡眠時,釋放對象鎖
  • 在sleep()休眠時間期滿後,該線程不一定會立即執行,這是因爲其它線程可能正在運行而且沒有被調度爲放棄執行,除非此線程具有更高的優先級;wait()使用notify或者notifyAlll或者指定睡眠時間來喚醒當前等待池中的線程
  • wait()必須放在synchronized block中,否則會在runtime時扔出java.lang.IllegalMonitorStateException異常



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章