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

Java interrupt()方法使用實(shí)例介紹

 更新時(shí)間:2023年02月03日 11:04:37   作者:愿做無(wú)知一猿  
一個(gè)線程在未正常結(jié)束之前, 被強(qiáng)制終止是很危險(xiǎn)的事情. 因?yàn)樗赡軒?lái)完全預(yù)料不到的嚴(yán)重后果比如會(huì)帶著自己所持有的鎖而永遠(yuǎn)的休眠,遲遲不歸還鎖等。 所以你看到Thread.suspend, Thread.stop等方法都被Deprecated了

前言

進(jìn)入正題之前還是先回顧一個(gè)會(huì)被問(wèn)無(wú)數(shù)遍的問(wèn)題:

stop和interrupt的區(qū)別是什么?

簡(jiǎn)單的說(shuō)就是,stop的話,那線程就真的結(jié)束了。

interrupt僅僅只是給線程標(biāo)記了一下,告訴你說(shuō)當(dāng)前線程可以結(jié)束了,你需要自己進(jìn)行結(jié)束線程。如果你自己不做處理,那這個(gè)方法調(diào)用了并看不出效果。

栗子一

不帶sleep等中斷拋異常方法的使用

上代碼:

public class TestClassSenseOne {
    public static void main(String[] args) throws InterruptedException {
        TestThread t = new TestThread();
        //開(kāi)啟子線程執(zhí)行
        t.start();
        //中斷子線程
        t.interrupt();
        //等待子線程執(zhí)行完畢,t.join() 可以這么理解,誰(shuí).join() 誰(shuí)阻塞當(dāng)前線程先執(zhí)行自己
        t.join();
        System.out.println("主線程結(jié)束");
    }
}
class TestThread extends Thread {
    @Override
    public void run() {
        while (!Thread.currentThread().isInterrupted()) {
            //沒(méi)有被標(biāo)記為中斷狀態(tài)就執(zhí)行,上面start后直接調(diào)用中斷,這句是不會(huì)輸出的
            System.out.println("我沒(méi)有被中斷");
        }
        System.out.println("啊——————————————————————————————斷了。");
    }
}

運(yùn)行結(jié)果:

啊——————————————————————————————斷了。
主線程結(jié)束

說(shuō)明:

上面這段代碼就是,interrupt()的基本用法,子線程TestThread會(huì)一直判斷當(dāng)前線程有沒(méi)有被標(biāo)記為可以中斷了,直到檢查到被標(biāo)記了,while循環(huán)結(jié)束,子線程任務(wù)結(jié)束。

栗子二

帶sleep的使用

public class TestClassSenseTwo {
    public static void main(String[] args) throws InterruptedException {
        TestThreadTwo t = new TestThreadTwo();
        //開(kāi)啟子線程執(zhí)行
        t.start();
        //模擬真實(shí)任務(wù),其實(shí)執(zhí)行5秒就執(zhí)行完了,再繼續(xù)等待到20s毫無(wú)意義
        Thread.sleep(5000);
        System.out.println("模擬真實(shí)任務(wù),其實(shí)執(zhí)行5秒就執(zhí)行完了,再繼續(xù)等待到20s毫無(wú)意義");
        //所以在這里中斷子線程
        t.interrupt();
        //等待子線程執(zhí)行完畢,t.join() 可以這么理解,誰(shuí).join() 誰(shuí)阻塞當(dāng)前線程先執(zhí)行自己
        t.join();
        System.out.println("主線程結(jié)束");
    }
}
class TestThreadTwo extends Thread {
    @Override
    public void run() {
        try {
            System.out.println("開(kāi)始執(zhí)行20秒的任務(wù)");
            Thread.sleep(20000);
            System.out.println("線程任務(wù)執(zhí)行完畢");
        } catch (InterruptedException e) {
            System.out.println("線程在sleep的時(shí)候被中斷。");
            return;
        }
    }
}

運(yùn)行結(jié)果:

開(kāi)始執(zhí)行20秒的任務(wù)
模擬真實(shí)任務(wù),其實(shí)執(zhí)行5秒就執(zhí)行完了,再繼續(xù)等待到20s毫無(wú)意義
線程在sleep的時(shí)候被中斷。
主線程結(jié)束

可以看到,這里了結(jié)束子線程的操作輸出是在 catch塊中做的,因?yàn)閟leep被中斷會(huì)拋出InterruptedException異常,同時(shí)也會(huì)清除當(dāng)前線程被標(biāo)記的 可被結(jié)束狀態(tài),如果不在catch塊中結(jié)束,那么interrupt的調(diào)用并不能提前結(jié)束子線程。

大栗子

場(chǎng)景下使用的例子

描述:

我在程序啟動(dòng)時(shí)有一個(gè)檢查菜單的任務(wù),這個(gè)任務(wù)需要一直被執(zhí)行,直到檢查成功。

思路:

我先定義一個(gè)任務(wù)線程類,在其中while (!Thread.currentThread().isInterrupted())執(zhí)行檢查菜單方法,當(dāng)檢查菜單方法使用interrupt中斷任務(wù)時(shí)說(shuō)明任務(wù)完成。

上代碼:

檢查方法的Service接口

public interface TestService {
    void checkMenu() throws InterruptedException;
}

實(shí)現(xiàn)類

public class TestServiceImpl implements TestService {
    @Override
    public void checkMenu() throws InterruptedException {
        System.out.println("檢查菜單----------->");
        //模擬隨機(jī)成功與失敗
        if (Math.random() * 10 > 4) {
            //模擬執(zhí)行檢查任務(wù)需要3秒耗時(shí)
            Thread.sleep(3000);
            //使用中斷的方式,結(jié)束任務(wù)。
            System.out.println("檢查任務(wù)完成******************,checkMenu()  使用interrupt()結(jié)束任務(wù)");
            Thread.currentThread().interrupt();
        }
    }
}

任務(wù)類

class DoMenuCheckTask extends Thread {
    @Override
    public void run() {
        TestService testService = new TestServiceImpl();
        //如果當(dāng)前線程沒(méi)有被中斷,說(shuō)明 checkMenu 沒(méi)有真正成功
        while (!Thread.currentThread().isInterrupted()) {
            try {
                testService.checkMenu();
                /*
                  下面這兩行的開(kāi)啟與關(guān)閉,便是兩種結(jié)束當(dāng)前任務(wù)的方式
                   1. 這里不使用sleep ,任務(wù)正常被 interrupt 結(jié)束
                   2. 這里使用 sleep, interrupt打斷的就是 sleep(),打斷sleep會(huì)清除isInterrupted中斷狀態(tài),
                        并拋出 java.lang.InterruptedException: sleep interrupted 異常,所以,不在catch塊中結(jié)束任務(wù),
                        任務(wù)便無(wú)法結(jié)束了。
                 */
//                System.out.println("菜單檢查沒(méi)有通過(guò)中斷完成任務(wù),休眠5秒后繼續(xù)執(zhí)行----------");
//                //如果這里使用了 sleep 那么任務(wù)便是通過(guò)下面catch塊中結(jié)束。
//                Thread.sleep(5000);
            } catch (InterruptedException e) {
                //被中斷,任務(wù)結(jié)束
                e.printStackTrace();
                System.out.println("菜單檢查通過(guò)中斷interrupt成功完成----------->>>>>>>>");
                return;
            }
        }
    }
}

執(zhí)行

public class SceneExample {
    public static void main(String[] args) throws InterruptedException {
        System.out.println("主線程開(kāi)始執(zhí)行----------->>>>>>>>");
        DoMenuCheckTask task = new DoMenuCheckTask();
        //開(kāi)始菜單檢查執(zhí)行任務(wù)
        task.start();
        //讓檢查任務(wù)先執(zhí)行
        task.join();
        System.out.println("主線程結(jié)束執(zhí)行----------->>>>>>>>");
    }
}

不使用sleep輸出結(jié)果:

主線程開(kāi)始執(zhí)行----------->>>>>>>>
檢查菜單----------->
檢查任務(wù)完成******************,checkMenu()  使用interrupt()結(jié)束任務(wù)
主線程結(jié)束執(zhí)行----------->>>>>>>>

Process finished with exit code 0

使用sleep的輸出結(jié)果:

主線程開(kāi)始執(zhí)行----------->>>>>>>>
檢查菜單----------->
檢查任務(wù)完成******************,checkMenu()  使用interrupt()結(jié)束任務(wù)
菜單檢查沒(méi)有通過(guò)中斷完成任務(wù),休眠5秒后繼續(xù)執(zhí)行----------
菜單檢查通過(guò)中斷interrupt成功完成----------->>>>>>>>
主線程結(jié)束執(zhí)行----------->>>>>>>>
java.lang.InterruptedException: sleep interrupted
    at java.lang.Thread.sleep(Native Method)
    at com.kusch.demo.test.example.DoMenuCheckTask.run(SceneExample.java:47)

Process finished with exit code 0

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

相關(guān)文章

  • Java 構(gòu)造器原理及用法解析

    Java 構(gòu)造器原理及用法解析

    這篇文章主要介紹了Java 構(gòu)造器原理及用法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • @ConfigurationProperties在IDEA中出現(xiàn)紅色波浪線問(wèn)題解決方法

    @ConfigurationProperties在IDEA中出現(xiàn)紅色波浪線問(wèn)題解決方法

    本文介紹了在Springboot項(xiàng)目中,當(dāng)@ConfigurationProperties注解出現(xiàn)紅色波浪線時(shí)的解決方法,文中有詳細(xì)的解決方案供大家參考,需要的朋友可以參考下
    2024-09-09
  • springboot實(shí)現(xiàn)圖片上傳與下載功能

    springboot實(shí)現(xiàn)圖片上傳與下載功能

    這篇文章主要為大家詳細(xì)介紹了后端spring項(xiàng)目經(jīng)常要做的功能,實(shí)現(xiàn)圖片上傳和下載,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-12-12
  • Spring Boot使用AOP實(shí)現(xiàn)REST接口簡(jiǎn)易靈活的安全認(rèn)證的方法

    Spring Boot使用AOP實(shí)現(xiàn)REST接口簡(jiǎn)易靈活的安全認(rèn)證的方法

    這篇文章主要介紹了Spring Boot使用AOP實(shí)現(xiàn)REST接口簡(jiǎn)易靈活的安全認(rèn)證的方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2018-11-11
  • Java生成UUID的常用方式示例代碼

    Java生成UUID的常用方式示例代碼

    UUID保證對(duì)在同一時(shí)空中的所有機(jī)器都是唯一的,通常平臺(tái)會(huì)提供生成的API,按照開(kāi)放軟件基金會(huì)(OSF)制定的標(biāo)準(zhǔn)計(jì)算,用到了以太網(wǎng)卡地址、納秒級(jí)時(shí)間、芯片ID碼和許多可能的數(shù)字,下面這篇文章主要給大家介紹了關(guān)于Java生成UUID的常用方式,需要的朋友可以參考下
    2023-05-05
  • SpringBoot+slf4j實(shí)現(xiàn)全鏈路調(diào)用日志跟蹤的方法(一)

    SpringBoot+slf4j實(shí)現(xiàn)全鏈路調(diào)用日志跟蹤的方法(一)

    本文重點(diǎn)給大家介紹Tracer集成的slf4j MDC功能,方便用戶在只簡(jiǎn)單修改日志配置文件的前提下輸出當(dāng)前 Tracer 上下文 TraceId,文章通過(guò)代碼給大家講解了在springboot中使用的技巧,感興趣的朋友跟隨小編一起看看吧
    2021-05-05
  • 詳解基于redis實(shí)現(xiàn)分布式鎖

    詳解基于redis實(shí)現(xiàn)分布式鎖

    系統(tǒng)的不斷擴(kuò)大,分布式鎖是最基本的保障。與單機(jī)的多線程不一樣的是,分布式跨多個(gè)機(jī)器。線程的共享變量無(wú)法跨機(jī)器。本文將介紹基于redis實(shí)現(xiàn)分布式鎖。
    2021-06-06
  • 23種設(shè)計(jì)模式(18)java備忘錄模式

    23種設(shè)計(jì)模式(18)java備忘錄模式

    這篇文章主要為大家詳細(xì)介紹了23種設(shè)計(jì)模式之java備忘錄模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Java環(huán)境下高德地圖Api的使用方式

    Java環(huán)境下高德地圖Api的使用方式

    這篇文章主要介紹了Java環(huán)境下高德地圖Api的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 淺談StringEntity 和 UrlEncodedFormEntity之間的區(qū)別

    淺談StringEntity 和 UrlEncodedFormEntity之間的區(qū)別

    這篇文章主要介紹了StringEntity 和 UrlEncodedFormEntity之間的區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06

最新評(píng)論

思南县| 赤峰市| 大厂| 桑日县| 全椒县| 阿克陶县| 寿阳县| 志丹县| 东方市| 聂荣县| 大冶市| 仪陇县| 庆云县| 确山县| 达孜县| 蓬莱市| 乌兰察布市| 衢州市| 天祝| 渭南市| 玉山县| 宁夏| 福清市| 汽车| 炎陵县| 保德县| 江口县| 柳河县| 钟祥市| 虹口区| 温州市| 琼海市| 西宁市| 祁阳县| 渭源县| 文化| 黄冈市| 定南县| 罗甸县| 和静县| 大丰市|