本文目錄一覽:
如何在JAVA中讓一個線程死亡或結束?
當線程執行完畢或被其它線程殺死,線程就進入死亡狀態,這時線程不可能再進入就緒狀態等待執行。
線程進入死亡狀態的方法有兩種:
1、自然終止:正常運行run()方法後終止;
2、異常終止:調用stop()方法讓一個線程終止運行。
如下代碼:
public class ThreadDemo implements Runnable{
public void run() {
}
}
當run方法執行結束,即線程死亡(結束)。
如何停止一個Java線程
1. 使用退出標誌,使線程正常退出,也就是當run方法完成後線程終止。
2. 使用stop方法強行終止線程(這個方法不推薦使用,因為stop和suspend、resume一樣,也可能發生不可預料的結果)。
3. 使用interrupt方法中斷線程。
1. 使用退出標誌終止線程
當run方法執行完後,線程就會退出。但有時run方法是永遠不會結束的。如在服務端程序中使用線程進行監聽客戶端請求,或是其他的需要循環處理的任務。在這種情況下,一般是將這些任務放在一個循環中,如while循環。如果想讓循環永遠運行下去,可以使用while(true){……}來處理。但要想使while循環在某一特定條件下退出,最直接的方法就是設一個boolean類型的標誌,並通過設置這個標誌為true或false來控制while循環是否退出。下面給出了一個利用退出標誌終止線程的例子。
如何優雅的關閉java線程
Java中終止線程的方式主要有三種:
1、使用stop()方法,已被棄用。原因是:stop()是立即終止,會導致一些數據被到處理一部分就會被終止,而用戶並不知道哪些數據被處理,哪些沒有被處理,產生了不完整的「殘疾」數據,不符合完整性,所以被廢棄。So, forget it!
2、使用volatile標誌位
看一個簡單的例子:
首先,實現一個Runnable介面,在其中定義volatile標誌位,在run()方法中使用標誌位控制程序運行:
public class MyRunnable implements Runnable {
//定義退出標誌,true會一直執行,false會退出循環
//使用volatile目的是保證可見性,一處修改了標誌,處處都要去主存讀取新的值,而不是使用緩存
public volatile boolean flag = true;
public void run() {
System.out.println(“第” + Thread.currentThread().getName() + “個線程創建”);
try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
//退出標誌生效位置
while (flag) {
}
System.out.println(“第” + Thread.currentThread().getName() + “個線程終止”);
}
}
然後,在main()方法中創建線程,在合適的時候,修改標誌位,終止運行中的線程。
public class TreadTest {
public static void main(String[] arg) throws InterruptedException {
MyRunnable runnable = new MyRunnable();
//創建3個線程
for (int i = 1; i = 3; i++) {
Thread thread = new Thread(runnable, i + “”);
thread.start();
}
//線程休眠
Thread.sleep(2000L);
System.out.println(“——————————————————————————”);
//修改退出標誌,使線程終止
runnable.flag = false;
}
}
最後,運行結果,如下:
第1個線程創建
第2個線程創建
第3個線程創建
————————–
第2個線程終止
第1個線程終止
第3個線程終止
3、使用interrupt()中斷的方式,注意使用interrupt()方法中斷正在運行中的線程只會修改中斷狀態位,可以通過isInterrupted()判斷。如果使用interrupt()方法中斷阻塞中的線程,那麼就會拋出InterruptedException異常,可以通過catch捕獲異常,然後進行處理後終止線程。有些情況,我們不能判斷線程的狀態,所以使用interrupt()方法時一定要慎重考慮。
答案來源於我的另一個回答:。
java 怎麼強制關閉 一個線程 ?
在Java的多線程編程中,java.lang.Thread類型包含了一些列的方法start(), stop(), stop(Throwable) and suspend(), destroy() and resume()。通過這些方法,我們可以對線程進行方便的操作,但是這些方法中,只有start()方法得到了保留。\x0d\x0a在Sun公司的一篇文章《Why are Thread.stop, Thread.suspend and Thread.resume Deprecated? 》中詳細講解了捨棄這些方法的原因。\x0d\x0a如果真的需要終止一個線程,可以使用以下幾種方法: \x0d\x0a1、讓線程的run()方法執行完,線程自然結束。(這種方法最好)\x0d\x0a\x0d\x0a2、通過輪詢和共享標誌位的方法來結束線程,例如while(flag){},flag的初始值設為真,當需要結束時,將flag的值設為false。(這種方法也不很好,因為如果while(flag){}方法阻塞了,則flag會失效)\x0d\x0a如果線程因為執行sleep()或是wait()而進入Not Runnable狀態,假如是wait() 用標誌位就方法就不行了,\x0d\x0apublic final void wait(long timeout)\x0d\x0a throws InterruptedException此方法導致當前線程(稱之為 T)將其自身放置在對象的等待集中,然後放棄此對象上的所有同步要求。即當前線程變為等待狀態\x0d\x0await() 的標準使用方法\x0d\x0asynchronized(obj){\x0d\x0awhile(){\x0d\x0aobj.wait();\x0d\x0a}\x0d\x0a滿足條件的處理過程\x0d\x0a}\x0d\x0a而您想要停止它,您可以使用第三種即\x0d\x0a3 使用interrupt(),而程式會丟出InterruptedException例外,因而使得執行緒離開run()方法
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/251961.html