最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中線程中斷停止的三種實現(xiàn)方法

 更新時間:2025年06月24日 09:11:10   作者:重生之Java開發(fā)工程師  
本文主要介紹了Java中線程中斷停止的三種實現(xiàn)方法,包括stop()方法但已廢棄且不安全,推薦使用volatile標志位或interrupt中斷機制,具有一定的參考價值,感興趣的可以了解一下

對于線程的停止,通常情況下我們是不會去手動去停止的,而是等待線程自然運行至結(jié)束,但在實際開發(fā)中,很多情況中需要我們提前去手動來停止線程,比如程序中出現(xiàn)異常錯誤、使用者關(guān)閉程序等情況中。如果不能很好地停止線程那么可能會導(dǎo)致各種問題,所以正確的停止線程是非常的重要的,常見的中斷線程的方式有以下幾種:

1、方式一:使用 Thread 類的 stop() 方法來終止線程(廢棄):

Thread 類的 stop() 方法雖然可以終止線程,但該方法已被標識為廢棄方法,原因是 stop() 方法太過暴力,即使線程只執(zhí)行一半,也會被強行終止,不能保證線程資源正確釋放,線程不安全,從而產(chǎn)生不可預(yù)料的結(jié)果,因此不提倡使用。

2、方式二:根據(jù) volatile 修飾的標志位判斷線程是否需要中斷:

    public static class ChangeObjectThread extends Thread 
    {
		// 表示是否停止線程
		private volatile boolean stopMe = true;
		public void stopMe() {
			stopMe = false;
		}
 
		@Override
		public void run() {
			while (!stopMe) {
                System.out.println("I'm running");
			}
		}
	}

在上面的代碼里面,定義了一個標記變量 stopMe,用于標識線程是否需要退出,當 stopMe() 方法被調(diào)用時,stopMe 就會被賦值為 false,此時在代碼里面的 while(!stopMe) 就會檢測到這個改動,線程就退出了

3、方式三:通過 interrupt 中斷機制終止線程:

該方式的核心就是通過 interrupt() 方法設(shè)置線程的中斷標志位,并通過 isInterrupt()/interrupted() 方法監(jiān)視并判斷中斷信號,當線程檢測到為 true 時則說明接收到中斷信號,此時需要被中斷線程做相應(yīng)的處理。但如何去響應(yīng)這個中斷信號,被中斷線程有完全的自主權(quán),也就是中斷結(jié)果是死亡或是繼續(xù)運行,取決于這個被中斷線程本身的邏輯。

  • Thread.interrupte():設(shè)置線程的中斷標志位為 true,表示被其他線程進行了中斷操作,但它不會像 stop() 方法那樣強制中斷正在運行的線程,僅僅起到通知被停止線程的作用;而被中斷線程,則需要通過監(jiān)視自身的標志位是否被中斷來進行響應(yīng),比如使用 isInterrupted() 或 interrupted() 方法來判斷是否被中斷;
  • this.interrupted():測試當前線程是否已經(jīng)中斷。如果連續(xù)兩次調(diào)用該方法,第一次返回 true,第二次返回false,因為 interrupted() 方法具有清除狀態(tài)的功能,它內(nèi)部實現(xiàn)是調(diào)用的當前線程的 isInterrupted(),并且會重置當前線程的中斷狀態(tài)。
  • this.isInterrupted():測試線程是否已經(jīng)中斷,但是不會清除狀態(tài)標識

3.1、使用 interrupt() + isInterrupted() 來中斷線程:

  public static void main(String[] args) throws InterruptedException {
     Thread thread=new Thread(()->{
         while (true){
             System.out.println("t1線程還在運行......");
             Thread current = Thread.currentThread();
             boolean interrupted = current.isInterrupted(); //默認值是false
             if (interrupted){  //如果外部調(diào)用中斷 那么會將該標記改為true
                 System.out.println("接受到中斷標記....."+interrupted+"開始中斷線程.....");
                 current.interrupted();//再次調(diào)用interrupted測試復(fù)位標記  會重置清除標記  注意是帶有ed 不是interrupt()方法
                 System.out.println("經(jīng)過interrupted復(fù)位后標記為:"+current.isInterrupted());
                 break;
             }
         }

     },"t1");
    thread.start();
    thread.interrupt(); //設(shè)置線程中斷
    }

//運行結(jié)果
t1線程還在運行......
接受到中斷標記.....true開始中斷線程.....
經(jīng)過interrupted復(fù)位后標記為:false

3.2、使用 interrupt() + InterruptedException 來中斷線程:

        Thread thread2=new Thread(()->{
            while (true){
                System.out.println("t2線程還在運行......");
                Thread current = Thread.currentThread();

                if (current.isInterrupted()){  //判斷當前線程是否中斷
                    System.out.println("接受到中斷標記....."+Thread.currentThread().isInterrupted());
                  //  break;
                }
                try {
                    TimeUnit.SECONDS.sleep(5); //5s睡眠
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    //因為拋出異常后會將線程標記恢復(fù)為 默認值false
                    System.out.println("Thread.currentThread().isInterrupted() = " + Thread.currentThread().isInterrupted());
                    break;
                }
            }

        },"t2");
        thread2.start();
        thread2.interrupt();
    }

t2線程還在運行......
接受到中斷標記.....true
Thread.currentThread().isInterrupted() = false
java.lang.InterruptedException: sleep interrupted
	at java.base/java.lang.Thread.sleep(Native Method)
	at java.base/java.lang.Thread.sleep(Thread.java:339)
	at java.base/java.util.concurrent.TimeUnit.sleep(TimeUnit.java:446)
	at com.java.thread.TestInterrupt.lambda$main$0(TestInterrupt.java:40)
	at java.base/java.lang.Thread.run(Thread.java:834)

從上面的執(zhí)行結(jié)果可以證明,當線程處于阻塞狀態(tài)(Sleep、wait、join)時,也是可以感受到中斷通知并拋出異常的,所以不用擔心長時間休眠中線程感受不到中斷了。

對于線程的停止,最正確最優(yōu)雅的方式就是通過 interrupt() 的方式來實現(xiàn),但 interrupt() 僅起到通知被停止線程的作用,對被停止的線程而言,它擁有完全的自主權(quán),既可以立即停止,也可以選擇一段時間后停止,也可以選擇不停止。比如拋出 InterruptedException 后,再次中斷設(shè)置,讓程序能后續(xù)繼續(xù)進行終止操作;也比如線程在進行 IO 操作時,比如寫文件操作,這時接收到終止線程的信號,那么它不會立馬停止,而是根據(jù)自身業(yè)務(wù)來判斷該如何處理,是將整個文件寫入成功后再停止還是不停止都取決于被通知線程的處理,因為如果立馬終止線程就可能造成數(shù)據(jù)的不完整性,這并不是業(yè)務(wù)所不希望的結(jié)果。那么可能很多讀者會疑惑,既然這樣那存在的意義有什么呢,其實是因為對于 Java 而言,就是期望程序之間是能夠相互通知、協(xié)作的管理線程

到此這篇關(guān)于Java中線程中斷停止的三種實現(xiàn)方法的文章就介紹到這了,更多相關(guān)Java 線程中斷停止內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java中HashMap的7種遍歷方式與性能分析

    java中HashMap的7種遍歷方式與性能分析

    本文主要介紹了java中HashMap的7種遍歷方式與性能分析,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Java網(wǎng)絡(luò)編程之TCP通信完整代碼示例

    Java網(wǎng)絡(luò)編程之TCP通信完整代碼示例

    這篇文章主要介紹了Java網(wǎng)絡(luò)編程之TCP通信完整代碼示例,具有一定借鑒價值,需要的朋友可以了解下。
    2017-12-12
  • Spring之@DependsOn注解詳細解析

    Spring之@DependsOn注解詳細解析

    這篇文章主要介紹了Spring之@DependsOn注解詳細解析,@DependsOn注解是Spring中提供的一個指定Spring創(chuàng)建Bean的依賴順序的注解,需要的朋友可以參考下
    2024-01-01
  • Java NoClassDefFoundError運行時錯誤分析解決

    Java NoClassDefFoundError運行時錯誤分析解決

    在Java開發(fā)中,NoClassDefFoundError是一種常見的運行時錯誤,它通常表明Java虛擬機在嘗試加載一個類時未能找到該類的定義,這個問題經(jīng)常與類路徑配置不正確或者缺失的庫文件有關(guān),需要的朋友可以參考下
    2025-05-05
  • 一文徹底搞懂Java中的回調(diào)函數(shù)

    一文徹底搞懂Java中的回調(diào)函數(shù)

    回調(diào)是一種常見的編程模式,允許一個函數(shù)在特定事件或任務(wù)完成后,調(diào)用另一個預(yù)先定義的函數(shù),這篇文章主要介紹了Java中回調(diào)函數(shù)的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2026-01-01
  • Jenkins發(fā)送測試報告郵件過程詳解

    Jenkins發(fā)送測試報告郵件過程詳解

    這篇文章主要介紹了Jenkins發(fā)送測試報告郵件過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • mybatis-plus通用枚舉@JsonValue接收參數(shù)報錯No enum constant

    mybatis-plus通用枚舉@JsonValue接收參數(shù)報錯No enum constant

    最近在使用mybatis-plus時用到了通用枚舉,遇到了問題,本文主要介紹了mybatis-plus通用枚舉@JsonValue接收參數(shù)報錯No enum constant,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • Java多線程之FutureTask的介紹及使用

    Java多線程之FutureTask的介紹及使用

    之前介紹了線程池相關(guān)的對象,Runable Callable與Future,下面介紹FutureTask的作用,它的特性是怎樣的呢,需要的朋友可以參考下
    2021-06-06
  • 非常實用的java自動答題計時計分器

    非常實用的java自動答題計時計分器

    這篇文章主要為大家詳細介紹了非常實用的java自動答題計時計分器的實現(xiàn)方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • SpringBoot中事務(wù)的只讀屬性詳解

    SpringBoot中事務(wù)的只讀屬性詳解

    這篇文章主要介紹了SpringBoot中事務(wù)的只讀屬性詳解,在開發(fā)過程中,事務(wù)是一個非常重要的概念,在?Spring?Boot中,事務(wù)是通過?AOP?機制來實現(xiàn)的,可以很方便地進行管理,需要的朋友可以參考下
    2023-08-08

最新評論

连城县| 维西| 伊川县| 鸡西市| 绵竹市| 治县。| 牟定县| 罗山县| 长岛县| 梁山县| 阳曲县| 华蓥市| 呼图壁县| 武穴市| 永新县| 措勤县| 内江市| 东阿县| 英超| 三明市| 荆州市| 尚义县| 鞍山市| 锡林浩特市| 灵寿县| 屯门区| 罗源县| 开平市| 利辛县| 砀山县| 宝丰县| 东丽区| 宽甸| 辽阳县| 临潭县| 武夷山市| 万年县| 桃园市| 称多县| 新建县| 陕西省|