Java執行緒隨筆

2021-08-21 12:25:37 字數 1864 閱讀 5756

目錄

守護執行緒

執行緒可見性

執行緒時序性

執行緒的中斷機制

基本概念

執行緒引用變數時不能直接從主記憶體中引用,如果執行緒工作記憶體中沒有該變數,則會從主記憶體中拷貝乙個副本到工作記憶體read-load,

在同一執行緒再度引用該字段時,有可能重新獲取副本,也有可能引用原來的副本read-load-use順序可由jvm實現系統決定,這時候執行緒與執行緒操作的先後順序決定你程式對主記憶體區最後的修改是否正確

第一種方法:thread.stop()已過時,不建議使用

第二種方法:利用interrupt()方法和機制

thread提供3中中斷執行緒的方法:

interrupt

public void interrupt()中斷執行緒。 

如果當前執行緒沒有中斷它自己(這在任何情況下都是允許的),則該執行緒的 checkaccess 方法就會被呼叫,這可能丟擲 securityexception。 

如果執行緒在呼叫 object 類的 wait()、wait(long) 或 wait(long, int) 方法,或者該類的 join()、join(long)、join(long, int)、sleep(long) 或 sleep(long, int) 方法過程中受阻,則其中斷狀態將被清除,它還將收到乙個 interruptedexception。 

如果該執行緒在可中斷的通道上的 i/o 操作中受阻,則該通道將被關閉,該執行緒的中斷狀態將被設定並且該執行緒將收到乙個 closedbyinterruptexception。 

如果該執行緒在乙個 selector 中受阻,則該執行緒的中斷狀態將被設定,它將立即從選擇操作返回,並可能帶有乙個非零值,就好像呼叫了選擇器的 wakeup 方法一樣。 

如果以前的條件都沒有儲存,則該執行緒的中斷狀態將被設定。

中斷乙個不處於活動狀態的執行緒不需要任何作用。

interrupted

public static boolean interrupted()測試當前執行緒是否已經中斷。執行緒的中斷狀態 由該方法清除。換句話說,如果連續兩次呼叫該方法,則第二次呼叫將返回 false(在第一次呼叫已清除了其中斷狀態之後,且第二次呼叫檢驗完中斷狀態前,當前執行緒再次中斷的情況除外)。 

執行緒中斷被忽略,因為在中斷時不處於活動狀態的執行緒將由此返回 false 的方法反映出來。 

isinterrupted

public boolean isinterrupted()測試執行緒是否已經中斷。執行緒的中斷狀態 不受該方法的影響。 

執行緒中斷被忽略,因為在中斷時不處於活動狀態的執行緒將由此返回 false 的方法反映出來。

/**

* 執行緒中斷

*/public class threaddemo implements runnable catch (interruptedexception e)

system.out.println("interrupting thread...");

thread.interrupt();

system.out.println("執行緒是否中斷: " + thread.isinterrupted());

try catch (interruptedexception e)

}@override

public void run()

if (thread.currentthread().isinterrupted())

try catch (interruptedexception e)

}system.out.println("執行緒退出請求 ...");

}}

Java執行緒隨筆(三)

1 併發工具類和併發容器 1.hashmap不是執行緒安全的,hashtable效率低下,因此考慮使用concurrenthashmap jdk1.7及以前,對hashmap中陣列進行分段鎖的機制,1600多行實現 jdk1.8採用元素鎖,鎖的是某個key,這個類的實現有6313行,顯然佔記憶體和效...

多執行緒隨筆

很久沒有更新blog了,太忙了,都沒時間來整理一下知識點,年底了有點時間了,可以好好整理以前寫的專案 了,順便把常用的業務方法都封裝成通用的方法,以便以後使用到能快速完成。切入主題,封裝了乙個常用的多執行緒使用場景的類庫,提供兩種模式,跟大家分享。很多時候,我們會遇到這種情況,事件a和事件b毫無關係...

java語法隨筆

執行順序 父類靜態 塊 子類靜態 塊 父類動態 塊 父類構造方法 子類動態 塊 子類構造方法 父類物件指向子類物件,只能呼叫父類中定義的方法,如被重寫,則執行子類的方法,如果呼叫沒有定義的方法,則編譯出錯。class father public father public void test pub...