Java終止線程的兩種方法
終止的基本思路
正常情況下不會出現(xiàn)run還沒有執(zhí)行完,線程突然就沒了的情況,所以我們想要終止線程就要讓run盡快執(zhí)行完畢,以下代碼都是通過讓run盡快執(zhí)行完畢這個思路來終止線程的
一.程序員手動設置標志位
package 停止多線程的方式;
/**
* Created with IntelliJ IDEA.
* Description:
* User: wuyulin
* Date: 2023-07-24
* Time: 23:06
*/
//1.程序員手動設置標志位,通過手動設置的標志位來讓run盡快結(jié)束
public class Demo1 {
private static boolean isQuit=false;
public static void main(String[] args) {
//boolean isQuit=false;
Thread thread=new Thread(()->{
while (!isQuit){
System.out.println("hello thread");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
});
thread.start();
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println("標注位修改,進程退出");
isQuit=true;
}
}在該方法中需要注意標志位的初始化位置,可以看lambda表達式中調(diào)用局部變量發(fā)生錯誤這篇博客描述了更多細節(jié)
二.使用Thread自帶的標志位
package 停止多線程的方式;
/**
* Created with IntelliJ IDEA.
* Description:
* User: wuyulin
* Date: 2023-07-25
* Time: 12:17
*/
//使用Thread自帶的標志位
public class Demo2 {
public static void main(String[] args) {
Thread thread=new Thread(()->{
//調(diào)用currentThread()靜態(tài)方法可以獲得當前線程的對象,也就是定義好了的thread
// 再用這個對象去調(diào)用isInterrupted()方法獲得Thread自帶的標志位
while (!Thread.currentThread().isInterrupted()){ //Thread.currentThread().isInterrupted()可以用Thread.interrupted()代替
// 但是不建議,因為interrupted()方法會在判定標志位的同時清除標志位
System.out.println("hello thread");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
//throw new RuntimeException(e);
break;
}
}
});
thread.start();
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
thread.interrupt(); //調(diào)用interrupt()方法時要是線程正在sleep當中就會強制使sleep拋出一個異常,立即喚醒,但是sleep喚醒了以后
//會自動清除前面設置的標志位,給程序員留下更多的操作空間(接下來的操作在catch中寫,比如要終止線程,就在catch中寫break)
}
}1.要通過Thread.currentThread().isInterrupted()來獲取Thread自帶的標志位,調(diào)用currentThread()靜態(tài)方法可以獲得當前線程的對象,也就是定義好了的thread,再用這個對象去調(diào)用isInterrupted()方法獲得Thread自帶的標志位,這段代碼可以用Thread.interrupted()代替但是不建議,因為interrupted()方法會在判定標志位的同時清除標志位,所以不合理,不推薦使用。
2.當線程中有sleep時就說明線程在一些時刻是處于睡眠狀態(tài)的,就會有一些特殊情況,調(diào)用interrupt()方法時要是線程正在sleep當中就會強制使sleep拋出一個異常,立即喚醒,但是sleep喚醒了以后會自動清除前面設置的標志位,給程序員留下更多的操作空間(接下來的操作在catch中寫,比如要終止線程,就在catch中寫break)
3.要是線程中沒有sleep時,thread.interrupt()就正常的修改標志位,將while循環(huán)結(jié)束,正常終止線程
到此這篇關于Java終止線程的兩種方法的文章就介紹到這了,更多相關Java終止線程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
JavaWeb response完成重定向?qū)崿F(xiàn)過程詳解
這篇文章主要介紹了JavaWeb response完成重定向?qū)崿F(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-02-02
使用Java橋接模式打破繼承束縛優(yōu)雅實現(xiàn)多維度變化
這篇文章主要為大家介紹了使用Java橋接模式打破繼承束縛,優(yōu)雅實現(xiàn)多維度變化,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05
Java深入了解數(shù)據(jù)結(jié)構(gòu)之棧與隊列的詳解
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)中的棧與隊列,在Java的時候,對于棧與隊列的應用需要熟練的掌握,這樣才能夠確保Java學習時候能夠有扎實的基礎能力。本文小編就來詳細說說Java中的棧與隊列,需要的朋友可以參考一下2022-01-01

