用戶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變量,加條件變量
六隻腳的烏龜
當線程任務完成,一般不用結束,讓他閒著,等著重用。不知道這算不算優雅。
廣州何劍鋒
身為一個程序員,如何優雅的結束一生?
伝石
我都是程序員了,加班成家常便飯了,談什麼優雅?