-
1 # jp19911127
-
2 # 三僡然
Thread.stop, Thread.suspend, Thread.resume and Runtime.runFinalizersOnExit由於一些潛在的執行緒安全問題, Oracle已棄用 。很少有公認的和廣為接受的方法來實現這一點,在本文中,我們將討論2 個用Java結束執行緒的方法。
使用標誌中斷執行緒。1.使用標誌
一種簡單的方法是使用執行緒來指示執行緒是否正在執行,並使用此標誌根據您的要求採取糾正措施,下面是一個示例程式碼,概述瞭如何使用標誌來殺死Java執行緒。
在上面的例子中。我們可以透過將執行變數設定為false來控制執行。在我們的示例中,我們使用AtomicBoolean了併發,如果您不想使用它(不推薦),您需要確保Boolean您在程式碼應該是易變的。可以使用 volatile代替他。
2.中斷執行緒
以上程式碼看起來不錯,但在採取上述方法之前需要考慮一些要點
如果我們有很多執行緒,它將變得更加複雜,我們需要確保使用join()方法完成這些執行緒。我們真的需要定義一個布林標誌,因為Java已經使用中斷標誌提供了這個功能嗎?在這個程式碼塊中有幾件非常重要的事情
我們不會吞下異常,而是將其傳遞給系統,以確保系統根據此異常採取糾正措施在上面的例子中,我們捕獲InterruptedException並立即用於立即 Thread.currentThread().interrupt() 中斷我們的執行緒。這是必需的,因為一旦丟擲異常就中斷了中斷標誌,並且如果我們的程式碼在巢狀迴圈中執行,它可能會導致一些問題。
總而言之,如果你仍然想要使用標誌方法,那麼Thread.interrupt()結束java執行緒的首選/推薦方法是你可能必須等待所有阻塞操作完成才能使用基於標誌的邏輯。
-
3 # 和博-明
線上程中等待同步的位置同時等待一個退出事件,從外部將事件置為訊號狀態,執行緒檢測到是退出事件發生,就可以自行清理現場,優雅退出了。
若從外部強行終止執行緒,則可能有資源沒歸還或釋放,屬於不得已而為之。
-
4 # alex136442470
java程式設計師
以下任何一個方案均可達到目的:
1.使用業務邏輯讓他正常走完;
2.被block的使用interrupt中斷,並在執行緒內捕獲處理;
3.宣告一個名字優雅的方法,呼叫執行緒stop;
4.寫一個優雅的類加優雅的方法名,呼叫System.exit(0);
5.查到java程序的名字,終端背景色修改為酒紅色,輸入kill 123321
7.身著火紅色旗袍,手握82年拉菲,輕抿紅唇,移步電錶間,輕輕的由上到下拉下開關;
8.參考駭客帝國第二集切斷髮電廠的方法
-
5 # 像我這樣的人優秀的人
早期的jdk版本中提供了退出的方法:hread.stop, Thread.suspend, Thread.resume和Runtime.runFinalizersOnExit ,因為操作不安全,可能會出現不可控的結果,已不推薦使用。
在回答之前咱們先看下執行緒的幾個狀態和狀態切換的過程,如下圖(不想畫了,網上盜圖):
執行緒退出肯定是初始化後的任何一個狀態(不包含終止態)退出。
執行緒啟動後是獨立執行的,正常來說啟動後是無法干預執行的,只能等其正在執行結束,如果想要干預,只能在共享記憶體區加狀態標識,其實jdk已經內建了一個狀態標識就是中斷標識,呼叫中斷方法,但是waiting狀態的執行緒會丟擲中斷異常,自己可以再最佳化下加共享狀態變數。
總結一下有三種方法:
2、呼叫中斷方法,判斷中斷標識。但是waiting狀態下會拋異常,不能算作優雅,示例程式碼如下:
3、自己加中斷狀態標識,示例程式碼如下:
總結下:
waiting狀態:此狀態下退出只能呼叫中斷方法。
blocked狀態:分兩種,一種可中斷,呼叫中斷方法退出;一種不可中斷,只能等running後退出。
ready狀態:等cpu排程,不可干預。
running狀態:自己加共享狀態標識。
所以最終“優雅退出”程式碼如下:
-
6 # 熙爸愛釣魚
在設計多執行緒程式一開始就考慮好執行緒在什麼時候自行結束,常見的做法是判斷控制訊號。死迴圈是糟糕的做法,而新手往往喜歡這麼幹。
強行結束執行緒會讓執行緒內部拋一個執行緒終止的異常,雖然能奏效,但打斷了正在進行的業務,而且可能導致資源不能正常釋放。
我習慣的方式是這樣,不知道算不算優美。
1,啟動執行緒時帶入控制訊號,執行緒內部檢查,必要的時候自行結束。同時要處理執行緒終止異常,做資源釋放等操作。
2,需要結束執行緒時,先發訊號讓執行緒自行結束,然後等待執行緒一段時間(時間長短視業務而定),如果執行緒還在活動,就強行終止。
-
7 # IT之家刺客
在java中,核心就一點,那就是讓run方法提前return!
不能讓執行一半的執行緒突然stop掉,而是讓它平穩的進入終止狀態。
回覆列表
建議看一下ThreadPoolExecutor原始碼對於worker的管理,當queue中獲取不到可執行的task(執行緒迴圈執行的條件),在對執行緒資料清理之後,就退出了執行緒的執行。