Java多執行緒程式設計核心技術(一)停止執行緒的三種方法

2021-08-21 12:14:55 字數 2212 閱讀 3898

使用退出標誌,使執行緒正常退出,也就是讓run()方法執行完成後停止

使用stop方法強行終止執行緒,但是不推薦使用這個方法,因為stop是作廢過期的方法,使用它可能產生不可預料的結果

使用interrupt方法中斷執行緒

package chapter1;

public class mythread extends thread

} public static void main(string args) throws interruptedexception

}

控制台輸出如下,可以看到在主線程中修改標記的值,使while迴圈停止,可以讓執行緒t正常退出,推薦使用這種方法

184908

184909

184910

184911

184912

184913

184914

184915

main end

package chapter1;

public class mythread extends thread

} public static void main(string args) throws interruptedexception

}

執行main方法,可以在控制台看到如下輸出,也可以完成執行緒的停止。

181458

181459

181460

181461

181462

181463

181464

181465

181466

181467

main end

既然stop方法可以完成執行緒的停止,為什麼jdk要廢棄掉這個方法,不建議使用呢?我們看一下下面這個例子:

首先建立乙個使用者類,裡面有乙個同步方法updateuser,為了便於觀察,模擬程式的執行時間,在兩次set中間休眠了1秒

package chapter1;

public class user

public void setusername(string username)

public string getpassword()

public void setpassword(string password)

public user(string username, string password)

synchronized public void updateuser(string u,string p) catch (interruptedexception e) }

}

接下來在主線程中我們執行0.5秒以後使用stop方法強制停止這個執行緒,觀察執行結果

package chapter1;

public class mythread extends thread

@override

public void run()

public static void main(string args) throws interruptedexception

}

控制台輸出結果如下:

username:b  password:aa
使用stop方法會強制停止執行緒,不管當前執行緒在幹什麼都會被停止,使用stop暴力釋放鎖可能會導致資料不一致的問題。

interrupt方法並不會真的停止執行緒,只是對執行緒做乙個標記,標記這個執行緒被中斷了,所以需要和return或者拋異常的方法結合來使用。

package chapter1;

public class mythread extends thread

}} catch (exception e)

} public static void main(string args) catch (interruptedexception e)

}}

其實第一種和第三種方式是類似的,都是通過標記判斷執行緒是否終止,然後使用return 或者throw a exception的方式來結束執行緒的執行,只不過interrupt不需要我們來定義標記。第二種方式使用stop方法太過於暴力,如果程式在執行一些很關鍵的操作,被強行終止,可能會發現意向不到的結果,最好還是不要使用。

《java多執行緒程式設計核心技術》核心筆記 一

執行緒具有優先順序 執行緒的優先順序具有繼承特性。被呼叫者繼承呼叫者的優先順序 優先順序高的執行緒 絕大部分會現執行 方法內的變數是執行緒安全的。多個執行緒訪問同乙個物件的同步方法時,一定是執行緒安全的。synchronized取得的是物件鎖 多個執行緒訪問乙個物件 synchronized 如果乙...

Java多執行緒 程式設計核心技術4Lock

執行緒間同步互斥,且嗅探鎖定 多路分支通知,使用上較synchronized靈活 呼叫該物件的lock 獲取鎖,unlock 釋放鎖 借助condition實現等待 通知模式 condition 物件監視器 是jdk5 靈活性 多路通知 乙個lock物件中建多個condition例項,執行緒物件可以...

Java多執行緒 程式設計核心技術5 Lock

1 計畫時間早於當前時間,提前執行 2 timertask類的cancel 方法 將自身從任務佇列中清除 3 timer類的cancel方法 清空任務佇列的全部任務 如果該方法沒有搶到鎖,任務還是繼續執行 4 schedule timertask task long delay,long perio...