亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java停止線程的3種方法

 更新時間:2022年05月09日 17:06:04   作者:??Java中文社群????  
這篇文章主要分享Java停止線程的3種方法,分別是自定義中斷標識符,停止線程、使用線程中斷方法interrupt停止線程、使用stop停止線程。下文詳細介紹需要的小伙伴可以參考一下

在 Java 中停止線程的實現(xiàn)方法有以下 3 種:

  • 自定義中斷標識符,停止線程。
  • 使用線程中斷方法 interrupt 停止線程。
  • 使用 stop 停止線程。

其中 stop 方法為 @Deprecated 修飾的過期方法,也就是不推薦使用的過期方法,因為 stop 方法會直接停止線程,這樣就沒有給線程足夠的時間來處理停止前的保存工作,就會造成數(shù)據(jù)不完整的問題,因此不建議使用。而自定義中斷標識也有一些問題,所以綜合來看,interrupt 方法才是最理想的停止線程的方法,接下來我們一起來看它們的具體差異。

1.自定義中斷標識符

自定義中斷標識符就是在程序中定義一個變量來決定線程是否要中斷執(zhí)行,具體實現(xiàn)代碼如下:

class FlagThread extends Thread {
    // 自定義中斷標識符
    public volatile boolean isInterrupt = false;
	@Override
    public void run() {
        // 如果為 true -> 中斷執(zhí)行
        while (!isInterrupt) {
            // 業(yè)務(wù)邏輯處理
        }
    }
}

但自定義中斷標識符的問題在于:線程中斷的不夠及時。因為線程在執(zhí)行過程中,無法調(diào)用 while(!isInterrupt) 來判斷線程是否為終止狀態(tài),它只能在下一輪運行時判斷是否要終止當(dāng)前線程,所以它中斷線程不夠及時,

比如以下代碼:

class InterruptFlag {
    // 自定義的中斷標識符
    private static volatile boolean isInterrupt = false;

    public static void main(String[] args) throws InterruptedException {
        // 創(chuàng)建可中斷的線程實例
        Thread thread = new Thread(() -> {
            while (!isInterrupt) { // 如果 isInterrupt=true 則停止線程
                System.out.println("thread 執(zhí)行步驟1:線程即將進入休眠狀態(tài)");
                try {
                    // 休眠 1s
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("thread 執(zhí)行步驟2:線程執(zhí)行了任務(wù)");
            }
        });
        thread.start(); // 啟動線程

        // 休眠 100ms,等待 thread 線程運行起來
        Thread.sleep(100);
        System.out.println("主線程:試圖終止線程 thread");
        // 修改中斷標識符,中斷線程
        isInterrupt = true;
    }
}

以上代碼的執(zhí)行結(jié)果如下圖所示: 

我們期望的是:線程執(zhí)行了步驟 1 之后,收到中斷線程的指令,然后就不要再執(zhí)行步驟 2 了,但從上述執(zhí)行結(jié)果可以看出,使用自定義中斷標識符是沒辦法實現(xiàn)我們預(yù)期的結(jié)果的,這就是自定義中斷標識符,響應(yīng)不夠及時的問題。

2.interrupt中斷線程

使用interrupt方法可以給執(zhí)行任務(wù)的線程,發(fā)送一個中斷線程的指令,它并不直接中斷線程,而是發(fā)送一個中斷線程的信號,把是否正在中斷線程的主動權(quán)交給代碼編寫者。相比于自定義中斷標識符而然,它能更及時的接收到中斷指令,

如下代碼所示:

public static void main(String[] args) throws InterruptedException {
    // 創(chuàng)建可中斷的線程實例
    Thread thread = new Thread(() -> {
        while (!Thread.currentThread().isInterrupted()) {
            System.out.println("thread 執(zhí)行步驟1:線程即將進入休眠狀態(tài)");
            try {
                // 休眠 1s
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                System.out.println("thread 線程接收到中斷指令,執(zhí)行中斷操作");
                // 中斷當(dāng)前線程的任務(wù)執(zhí)行
                break;
            }
            System.out.println("thread 執(zhí)行步驟2:線程執(zhí)行了任務(wù)");
        }
    });
    thread.start(); // 啟動線程

    // 休眠 100ms,等待 thread 線程運行起來
    Thread.sleep(100);
    System.out.println("主線程:試圖終止線程 thread");
    // 修改中斷標識符,中斷線程
    thread.interrupt();
}

以上代碼的執(zhí)行結(jié)果如下圖所示: 

 從上述結(jié)果可以看出,線程在接收到中斷指令之后,立即中斷了線程,相比于上一種自定義中斷標識符的方法來說,它能更及時的響應(yīng)中斷線程指令。

3.stop停止線程

stop 方法雖然可以停止線程,但它已經(jīng)是不建議使用的廢棄方法了,這一點可以通過 Thread 類中的源碼發(fā)現(xiàn),stop 源碼如下: 

 從上面的圖片可以看出,stop 方法是被 @Deprecated 修飾的不建議使用的過期方法,并且在注釋的第一句話就說明了 stop 方法為非安全的方法。在最新版本 Java 中,此方法已經(jīng)被直接移除了,所以強烈不建議使用。

總結(jié)

本文介紹了停止線程的 3 種方法:

  • 自定義中斷標識符的停止方法,此方法的缺點是不能及時響應(yīng)中斷請求;
  • 使用 interrupt 中斷線程方法,此方法是發(fā)送一個中斷信號給線程,它可以及時響應(yīng)中斷,也是最推薦使用的方法;
  • 最后是 stop 方法,雖然它也可以停止線程,但此方法已經(jīng)是過時的不建議使用的方法,在 Java 最新版本中已經(jīng)被直接移除了,所以不建議使用。

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

相關(guān)文章

  • Java圖形界面超實用使用教程

    Java圖形界面超實用使用教程

    在Java編程中圖形界面應(yīng)用程序是非常常見和重要的一部分,下面這篇文章主要給大家介紹了關(guān)于Java圖形界面的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-01-01
  • Spring?Boot的優(yōu)點及項目創(chuàng)建步驟詳解

    Spring?Boot的優(yōu)點及項目創(chuàng)建步驟詳解

    這篇文章主要介紹了Spring?Boot的優(yōu)點及項目創(chuàng)建步驟,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09
  • Idea安裝Eslint插件提示:Plugin NativeScript was not installed的問題

    Idea安裝Eslint插件提示:Plugin NativeScript was not installed的問題

    這篇文章主要介紹了Idea安裝Eslint插件提示:Plugin NativeScript was not installed的問題,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • JDBC簡介_動力節(jié)點Java學(xué)院整理

    JDBC簡介_動力節(jié)點Java學(xué)院整理

    什么是JDBC?這篇文章就為大家詳細介紹了Java語言中用來規(guī)范客戶端程序如何來訪問數(shù)據(jù)庫的應(yīng)用程序接口,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • MyBatisPlus代碼生成器的使用示例

    MyBatisPlus代碼生成器的使用示例

    本文主要介紹了MyBatisPlus代碼生成器的使用示例,通過 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各個模塊的代碼,感興趣的可以了解一下
    2021-12-12
  • 深入java內(nèi)存查看與分析詳解

    深入java內(nèi)存查看與分析詳解

    本篇文章是對java內(nèi)存查看進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • Java連接并操作Redis超詳細教程

    Java連接并操作Redis超詳細教程

    在分布式系統(tǒng)和高并發(fā)場景中,Redis?作為高性能內(nèi)存數(shù)據(jù)庫的地位舉足輕重,對于?Java?開發(fā)者而言,掌握?Redis?的連接與操作是進階必備技能,本文從?Java?操作?Redis?的核心需求出發(fā),通過完整代碼示例與逐行解析,需要的朋友可以參考下
    2025-05-05
  • 如何在 Spring Boot 中配置和使用 CSRF 保護

    如何在 Spring Boot 中配置和使用 CSRF 保護

    CSRF是一種網(wǎng)絡(luò)攻擊,它利用已認證用戶的身份來執(zhí)行未經(jīng)用戶同意的操作,Spring Boot 提供了內(nèi)置的 CSRF 保護機制,可以幫助您防止這種類型的攻擊,這篇文章主要介紹了Spring?Boot?中的?CSRF?保護配置的使用方法,需要的朋友可以參考下
    2023-09-09
  • SpringBoot中實現(xiàn)分布式的Session共享的詳細教程

    SpringBoot中實現(xiàn)分布式的Session共享的詳細教程

    這篇文章主要介紹了SpringBoot中實現(xiàn)分布式的Session共享,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • SpringBoot各種參數(shù)校驗的實例教程

    SpringBoot各種參數(shù)校驗的實例教程

    經(jīng)常需要提供接口與用戶交互(獲取數(shù)據(jù)、上傳數(shù)據(jù)等),由于這個過程需要用戶進行相關(guān)的操作,為了避免出現(xiàn)一些錯誤的數(shù)據(jù)等,一般需要對數(shù)據(jù)進行校驗,下面這篇文章主要給大家介紹了關(guān)于SpringBoot各種參數(shù)校驗的相關(guān)資料,需要的朋友可以參考下
    2022-03-03

最新評論