身為一個程序員,如何優雅的結束一個線程?

用戶68044589


早期的jdk版本中提供了退出的方法:hread.stop, Thread.suspend, Thread.resume和Runtime.runFinalizersOnExit ,因為操作不安全,可能會出現不可控的結果,已不推薦使用。


在回答之前咱們先看下線程的幾個狀態和狀態切換的過程,如下圖(不想畫了,網上盜圖):

線程退出肯定是初始化後的任何一個狀態(不包含終止態)退出。

線程啟動後是獨立運行的,正常來說啟動後是無法干預運行的,只能等其正在運行結束,如果想要干預,只能在共享內存區加狀態標識,其實jdk已經內置了一個狀態標識就是中斷標識,調用中斷方法,但是waiting狀態的線程會拋出中斷異常,自己可以再優化下加共享狀態變量。

總結一下有三種方法:

1、等線程自己執行完結束(這種最優雅,但是也沒有討論的意義了)。

2、調用中斷方法,判斷中斷標識。但是waiting狀態下會拋異常,不能算作優雅,示例代碼如下:

3、自己加中斷狀態標識,示例代碼如下:

總結下:

waiting狀態:此狀態下退出只能調用中斷方法。

blocked狀態:分兩種,一種可中斷,調用中斷方法退出;一種不可中斷,只能等running後退出。

ready狀態:等cpu調度,不可干預。

running狀態:自己加共享狀態標識。

所以最終“優雅退出”代碼如下:


像我這樣的人優秀的人


java程序員

以下任何一個方案均可達到目的:

1.使用業務邏輯讓他正常走完;

2.被block的使用interrupt中斷,並在線程內捕獲處理;

3.聲明一個名字優雅的方法,調用線程stop;

4.寫一個優雅的類加優雅的方法名,調用System.exit(0);

5.查到java進程的名字,終端背景色修改為酒紅色,輸入kill 123321

6.手指成蘭花狀,輕輕的按下關機按鈕10秒

7.身著火紅色旗袍,手握82年拉菲,輕抿紅唇,移步電錶間,輕輕的由上到下拉下開關;

8.參考黑客帝國第二集切斷髮電廠的方法


alex136442470


在設計多線程程序一開始就考慮好線程在什麼時候自行結束,常見的做法是判斷控制信號。死循環是糟糕的做法,而新手往往喜歡這麼幹。

強行結束線程會讓線程內部拋一個線程終止的異常,雖然能奏效,但打斷了正在進行的業務,而且可能導致資源不能正常釋放。

我習慣的方式是這樣,不知道算不算優美。

1,啟動線程時帶入控制信號,線程內部檢查,必要的時候自行結束。同時要處理線程終止異常,做資源釋放等操作。

2,需要結束線程時,先發信號讓線程自行結束,然後等待線程一段時間(時間長短視業務而定),如果線程還在活動,就強行終止。


xdm99


高級工程師都是直接拔電源的


旁觀者337


優雅的結束當然是執行完了,中斷什麼的太不優雅了。要是線程內死循環那就優雅的等死吧😄


dawn8227


直接關機,優雅的轉身,就可以了。


PlatoJobs


atomic變量,加條件變量


六隻腳的烏龜


當線程任務完成,一般不用結束,讓他閒著,等著重用。不知道這算不算優雅。


廣州何劍鋒


身為一個程序員,如何優雅的結束一生?


伝石


我都是程序員了,加班成家常便飯了,談什麼優雅?


分享到:


相關文章: