1、引發執行緒問題的核心是因為資源共享。
2、執行緒分為兩種:
2.1、應用執行緒,也就是通常我們理解的執行緒。
3、執行緒的定義方式:
3.1、繼承thread類。
3.2、實現runable介面。
區別是:繼承和介面實現的區別。
4、每個執行緒在執行前都能計算出所需的棧大小,計算單位:槽。索引佔位符和基本型別(除8個位元組的long,double)都占用1個槽,long和double占用2個槽。執行緒的記憶體分配在虛擬機器棧中,執行緒數取決於虛擬機器棧大小。
6、鎖是object擁有,在物件的物件頭中會有專門的標識,識別該物件是否被其他執行緒占用。
7、類鎖、方法鎖、塊鎖實質都是獲取物件鎖,也是共用的,synchronize獲取物件鎖是可重入的:乙個執行緒在獲取物件鎖後,在未釋放物件鎖時可以同時再獲取該物件鎖,同步方法中可以呼叫其他同步方法。
8、多執行緒只有在物件標識了同步的方法、塊內才會同步,其他則是採用非同步。
9、synchronized是基於虛擬機器指令:monitorenter和monitorexit指令,可以有多次(重入鎖),但指令都是成雙成對出現。這裡特別注意:在出現異常時,會自動釋放物件鎖。
10、如何乙個執行緒停止另外乙個執行緒:
10.1、每個執行緒物件都有乙個中斷標識,乙個執行緒不能停止另外乙個執行緒,只能通過執行緒本身根據中斷標識來決定自己知否停止(這裡的停止並不是stop這樣的強行停止,而是通過中斷標識來跳過某些執行操作,執行緒還是會繼續執行下去,只是跳過了中斷標識決定的部分:if(中斷標識) ; 仍然會執行的部分),可以在另外乙個執行緒內,設定這個中斷標識,這樣就達到了,在乙個執行緒中停止另外乙個執行緒。
10.2、執行緒判斷自己是否擁有中斷標識方法:
10.2.1、threadinstance.interrupted():檢測線程例項知否有中斷標識,如果有返回true,並且會清除該執行緒的中斷標識。
10.2.2、threadinstance.isinterrupted():檢測線程例項是否有中斷標識,返回true or false,不會清楚該執行緒的中斷標識。
10.2.3、threadinstance.interrupt():給執行緒例項新增中斷標識,在外部執行緒新增中斷標識後,該執行緒立馬可見。中斷標識只是起標識作用,具體執行緒是否停止由執行緒自己決定。想要不執行後面的**也可以通過丟擲異常,然後通過新增異常抓捕方式來實現跳躍。
案例:/**
* 實現執行緒a中斷執行緒b
*/public class threadinterrupttest
public static class threada extends thread
@override
public void run()
}public static class threadb extends thread
system.out.println(thread.currentthread().getname()+"偷了"+i+"塊錢");}}
}}使用上面這種情況需要執行緒b不斷的判斷是否有中斷標識,如果執行緒b睡著了sleep().sleep()方法使執行緒暫停一段時間,並不會釋放物件鎖,同時他還會不斷的輪詢當前執行緒是否有中斷標識,如果有中斷標識就會丟擲interruptedexception,這也是我們為什麼在使用sleep()方法時需要新增異常捕捉或丟擲異常。
案例:/**
* 實現執行緒a中斷執行緒b
*/public class threadinterrupttest
public static class threada extends thread
@override
public void run()
}public static class threadb extends thread catch (interruptedexception e) }}
}以上兩種情況均能知道執行緒b執行到了**被停止了。
10.3、threadinstance.stop()方法同樣能夠停止執行緒,暴力停止,隨時,強制。弊端是不能夠確定執行緒執行到**就被停止了,jdk1.7後的版本均@deprecated注釋,不建議使用。
stop()方法,會丟擲threaddeath 這個方法被vm自行處理:
// the vm can handle all thread states
stop0(new threaddeath()); 這個為native標識的本地方法。
這裡有並沒有顯示要求抓捕這個異常,但是卻可以顯示的抓捕到異常。猜測:try-cath抓捕的異常只有使用throw new exception() 和 throws exception 的方式編譯器要求需要顯示抓捕。
10.4、suspend() 和 resume() 是掛起執行緒和恢復執行緒,都是獨佔鎖,在掛起時不會釋放物件鎖。注意:system.out.println()這個方法是執行緒安全的,會讓當前執行緒獲取鎖。
部分原始碼:
public void println(string x)
}10.5、
初步理解多執行緒程式設計
1.繼承thread類,重寫run 方法thread本質上也是實現了runnable介面的乙個例項。需要注意的是呼叫start 方法後並不是立即地執行多執行緒的 而是使該執行緒變為可執行態,什麼時候執行多執行緒 是由作業系統決定的。以下是其 主要步驟 1 定義thread類的子類,並重寫該類的run...
多執行緒 理解多執行緒(一)
程序 程序是cpu分配資源的基本單位 執行緒 執行緒是cpu排程的基本單位 資源分配給程序,所有執行緒共享該程序的資源 當執行緒數大於cpu的數量,會出現時間片的輪詢。cpu時間片是直接分配給執行緒的,執行緒拿到cpu時間片就能執行了 cpu時間片不是先分給程序然後再由程序分給程序下的執行緒的。所有...
多執行緒理解
本文介紹我對於多執行緒的理解。一 概念 1.作業系統下的多程序場景 但其實上面的情景是屬於作業系統下的多程序,不是單個程式內的多程序,這種多程序跟我們在單個程式內的多執行緒沒有什麼可以比較的。2.執行緒 舉個最簡單例子 我們的任務需要兩個計算型操作 a b 每個操作耗時10秒,如果是單執行緒,這時我...