欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java停止線程的3種方法

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

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

  • 自定義中斷標(biāo)識(shí)符,停止線程。
  • 使用線程中斷方法 interrupt 停止線程。
  • 使用 stop 停止線程。

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

1.自定義中斷標(biāo)識(shí)符

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

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

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

比如以下代碼:

class InterruptFlag {
    // 自定義的中斷標(biāo)識(shí)符
    private static volatile boolean isInterrupt = false;

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

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

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

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

2.interrupt中斷線程

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

如下代碼所示:

public static void main(String[] args) throws InterruptedException {
    // 創(chuàng)建可中斷的線程實(shí)例
    Thread thread = new Thread(() -> {
        while (!Thread.currentThread().isInterrupted()) {
            System.out.println("thread 執(zhí)行步驟1:線程即將進(jìn)入休眠狀態(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(); // 啟動(dòng)線程

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

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

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

3.stop停止線程

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

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

總結(jié)

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

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

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

相關(guān)文章

  • 實(shí)例展示使用Java壓縮和解壓縮7z文件的方法

    實(shí)例展示使用Java壓縮和解壓縮7z文件的方法

    這篇文章主要介紹了實(shí)例展示使用Java壓縮和解壓縮7z文件的方法,用到了7-zip的開源項(xiàng)目7-zip-JBinding,需要的朋友可以參考下
    2015-11-11
  • java數(shù)據(jù)結(jié)構(gòu)之實(shí)現(xiàn)雙向鏈表的示例

    java數(shù)據(jù)結(jié)構(gòu)之實(shí)現(xiàn)雙向鏈表的示例

    這篇文章主要介紹了java數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)雙向鏈表的示例,需要的朋友可以參考下
    2014-03-03
  • Spring Boot中的JdbcTemplate是什么及用法小結(jié)

    Spring Boot中的JdbcTemplate是什么及用法小結(jié)

    Spring Boot中的JdbcTemplate是一個(gè)強(qiáng)大的數(shù)據(jù)庫訪問工具,它簡(jiǎn)化了數(shù)據(jù)庫操作的過程,在本文中,我們了解了JdbcTemplate的基本概念,并演示了如何在Spring Boot應(yīng)用程序中使用它,感興趣的朋友跟隨小編一起看看吧
    2023-10-10
  • Java的動(dòng)態(tài)代理模式之JDK代理詳解

    Java的動(dòng)態(tài)代理模式之JDK代理詳解

    這篇文章主要介紹了Java的動(dòng)態(tài)代理模式之JDK代理詳解,代理對(duì)象,不需要實(shí)現(xiàn)接口,但是目標(biāo)對(duì)象要實(shí)現(xiàn)接口,否則不能用動(dòng)態(tài)代理,JDK?實(shí)現(xiàn)代理只需要使用?newProxyInstance?方法,但是該方法需要接收三個(gè)參數(shù),需要的朋友可以參考下
    2023-11-11
  • java 使用Graphics2D在圖片上寫字

    java 使用Graphics2D在圖片上寫字

    這篇文章主要介紹了java 使用Graphics2D在圖片上寫字,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • java使用zookeeper實(shí)現(xiàn)的分布式鎖示例

    java使用zookeeper實(shí)現(xiàn)的分布式鎖示例

    這篇文章主要介紹了java使用zookeeper實(shí)現(xiàn)的分布式鎖示例,需要的朋友可以參考下
    2014-05-05
  • Java數(shù)據(jù)結(jié)構(gòu)中雙向鏈表的實(shí)現(xiàn)

    Java數(shù)據(jù)結(jié)構(gòu)中雙向鏈表的實(shí)現(xiàn)

    這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)中雙向鏈表的實(shí)現(xiàn),雙向鏈表是一種常見的數(shù)據(jù)結(jié)構(gòu),它允許在鏈表中的任意位置進(jìn)行高效的插入和刪除操作,需要的朋友可以參考下
    2022-05-05
  • Spring Boot集成Swagger2項(xiàng)目實(shí)戰(zhàn)

    Spring Boot集成Swagger2項(xiàng)目實(shí)戰(zhàn)

    在日常的工作中,我們往往需要給前端(WEB端、IOS、Android)或者第三方提供接口,這個(gè)時(shí)候我們就需要給他們提供一份詳細(xì)的API說明文檔。這篇文章我們就來分享一種API文檔維護(hù)的方式,即通過Swagger來自動(dòng)生成Restuful API文檔
    2018-01-01
  • SpringBoot中@ControllerAdvice注解的使用方法

    SpringBoot中@ControllerAdvice注解的使用方法

    這篇文章主要介紹了SpringBoot中@ControllerAdvice注解的使用方法,這是一個(gè)增強(qiáng)的?Controller,對(duì)controller層做異常處理、數(shù)據(jù)預(yù)處理、全局?jǐn)?shù)據(jù)綁定,?springboot?會(huì)自動(dòng)掃描到,不需要調(diào)用,這個(gè)注解是spring?MVC提供的,在springboot中也可以使用,需要的朋友可以參考下
    2024-01-01
  • Java Spring框架簡(jiǎn)介與Spring IOC詳解

    Java Spring框架簡(jiǎn)介與Spring IOC詳解

    Spring 框架是一個(gè)輕量級(jí)的解決方案,可以一站式地構(gòu)建企業(yè)級(jí)應(yīng)用。它是為了解決 企業(yè)應(yīng)用開發(fā)的復(fù)雜性而創(chuàng)建的。Spring 使用基本的 JavaBean 來完成以前只可能由 EJB 完成的事情。IOC 是 Inversion of Control 的縮寫,多數(shù)書籍翻譯成控制反轉(zhuǎn)
    2021-09-09

最新評(píng)論