線程知識小集合

線程知識小集合

1、停止線程
(1)run方法結束,開啓多線程運行,運行代碼通常是循環體,只要控制住循環,就可以讓run方法結束,也就是結束線程。
(2)特殊情況:當線程屬於凍結狀態,就不會讀取循環控制標記,則線程就不會結束。

爲解決該特殊情況,可引入Thread類中的Interrupt方法結束線程的凍結狀態
當沒有指定的方式讓凍結線程恢復到運行狀態時,需要對凍結進行清除,強制讓線程恢復到運行狀態

2、interrupt

void interrupt() 中斷線程: 
		清除中斷狀態,出現InterruptedException

3、守護線程(後臺線程)
(1)setDaemon(boolean on): 標記爲守護線程或者用戶線程。
(2)當正在運行的線程都是守護線程時,java虛擬機jvm退出, 守護線程必須在啓動線程前調用;
(3)守護線程的特點:

  • 守護線程開啓後和前臺線程共同搶奪cpu的執行權
  • 開啓、運行兩者都沒區別
  • 結束時有區別,當所有前臺線程都結束後,守護線程會自動結束。

4、多線程join方法
(1)void join() 等待該線程終止。
(2)void join(long millis) 等待該線程終止的時間最長爲 millis 毫秒。
(3)throws InterruptedException
(4)特點:當A線程執行到B線程的join方法時,A就會等待B線程都執行完纔會執行
(5)作用: join可以用來臨時加入線程執行

5、多線程優先級:yield()方法
(1)yield():暫停當前正在執行的線程對象,並執行其他線程
(2)setPriority(int newPriority):更改線程優先級
(3)int getPriority() 返回線程的優先級。
(3)String toString() 返回該線程的字符串表示形式,包括線程名稱、優先級和線程組(4)
(4)優先級

MAX_PRIORITY:最高優先級(10)
Min_PRIORITY:最低優先級(1)
Morm_PRIORITY:默認優先級(5)

6、ThreadLocal類
(1)ThreadLocal類提供了線程局部 (thread-local) 變量, 是一個線程級別的局部變量,並非“本地線程”。
(2)ThreadLocal 爲每個使用該變量的線程,提供了一個獨立的變量副本,每個線程修改副本時不影響其它線程對象的副本
(3)線程局部變量(ThreadLocal variables)的關鍵點:

  • 一個線程局部變量(ThreadLocal variables)爲每個線程方便地提供了一個單獨的變量。
  • ThreadLocal實例通常作爲靜態的私有的(private static)字段出現在一個類中,這個類用來關聯一個線程
  • 當多個線程訪問ThreadLocal 實例時,每個線程維護 ThreadLocal 提供的獨立的變量副本
  • 常用的使用可在 DAO 模式中見到,當DAO 類作爲一個單例類時,數據庫鏈接(connection)被每一個線程獨立的維護,互不影響(基於線程的單例)

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

8、在靜態方法上使用同步時的問題

同步靜態方法時會獲取該類的“Class”對象,所以當一個線程進入同步的靜態方法中時,
線程監視器獲取類本身的對象鎖,其它線程不能進入這個類的任何靜態同步方法。 它不像實例方法,因爲多個線程可以同時訪問不同實例同步實例方法。

9、當一個同步方法已經執行,線程能夠調用對象上的非同步實例方法嗎?
(1)可以,一個非同步方法總是可以被調用而不會有任何問題。
(2)實際上,Java 沒有爲非同步方法做任何檢查,鎖對象僅僅在同步方法或者同步代碼塊中檢查。
(3)如果一個方法沒有聲明爲同步,即使你在使用共享數據Java照樣會調用,而不會做檢查是否安全,一個方法是否聲明爲同步取決於臨界區訪問(critial section access),如果方法不訪問臨界區(共享資源或者數據結構)就沒必要聲明爲同步的。

10、在一個對象上兩個線程可以調用兩個不同的同步實例方法嗎?
不能,因爲一個對象已經同步了實例方法,線程獲取了對象的對象鎖, 只有執行完該方法釋放對象鎖後才能執行其它同步方法。

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

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

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