如何優雅的結束一個線程?
謝謝邀請!
早期的jdk版本中提供了退出的方法:hread.stop, Thread.suspend, Thread.resume和Runtime.runFinalizersOnExit ,因為操作不安全,可能會出現不可控的結果,已不推薦使用。
在回答之前咱們先看下線程的幾個狀態和狀態切換的過程,如下圖(不想畫了,網上盜圖):
線程退出肯定是初始化后的任何一個狀態(不包含終止態)退出。
線程啟動后是獨立運行的,正常來說啟動后是無法干預運行的,只能等其正在運行結束,如果想要干預,只能在共享內存區加狀態標識,其實jdk已經內置了一個狀態標識就是中斷標識,調用中斷方法,但是waiting狀態的線程會拋出中斷異常,自己可以再優化下加共享狀態變量。
總結一下有三種方法:
1、等線程自己執行完結束(這種最優雅,但是也沒有討論的意義了)。
2、調用中斷方法,判斷中斷標識。但是waiting狀態下會拋異常,不能算作優雅,示例代碼如下:
3、自己加中斷狀態標識,示例代碼如下:
總結下:
waiting狀態:此狀態下退出只能調用中斷方法。
blocked狀態:分兩種,一種可中斷,調用中斷方法退出;一種不可中斷,只能等running后退出。
ready狀態:等cpu調度,不可干預。
running狀態:自己加共享狀態標識。
所以最終“優雅退出”代碼如下: