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

Java利用異常中斷當前任務的技巧分享

 更新時間:2023年08月28日 14:05:26   作者:樂征skyline  
在日常開發(fā)中,我們經(jīng)常遇到調(diào)用別人的代碼來完成某個任務,但是當代碼比較耗時的時候,沒法從外部終止該任務,所以本文為大家介紹了如何利用異常中斷當前任務,需要的可以參考下

Java小技巧:利用異常中斷當前任務

在日常開發(fā)中,我們經(jīng)常遇到調(diào)用別人的代碼來完成某個任務,但是當代碼比較耗時的時候,沒法從外部終止該任務。有些程序從開始就考慮到了這個場景,就會提供對應的cancelstop之類的方法用于終止任務,但還是會有很多三方庫并沒有提供響應接口。比如,下面這個下載示例:

class DownloadTask {
    public void download(Listener listener) {
        try {
            for (int i = 0; i < 100; i++) {//模擬下載過程
                Thread.sleep(1000);
                listener.onProgressUpdated(i + 1);
            }
            listener.onCompleted();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
    public interface Listener {
        void onProgressUpdated(int progress);
        void onCompleted();
    }
}
public class Main {
    public static void main(String[] args) throws InterruptedException {
        DownloadTask task = new DownloadTask();
        task.download(new DownloadTask.Listener() {
            @Override
            public void onProgressUpdated(int progress) {
                System.out.println("onProgressUpdated: " + progress);
                if (isInterrupted.get()) {
                    throw new EndException();
                }
            }
            @Override
            public void onCompleted() {
            }
        });
    }
}

這里的DownloadTask開始運行后,就無法直接停止。如果DownloadTask是第三方庫的代碼時,我們可能不方便改它的代碼使其支持中斷。本文介紹一種利用異常來終止這樣的任務的方法。

(注:本文介紹的方法僅限于單線程或單個子線程的情況,并且需要有在任務運行的線程執(zhí)行代碼的能力,比如回調(diào))

場景1:任務沒有另起線程的情況

這個就是上面展示的那個下載示例,我們可以通過回調(diào),直接利用異常中斷該任務:

//DownloadTask 同上
public class Main {
    private static volatile boolean isInterrupted;
    public static void main(String[] args) throws InterruptedException {
        new Thread(() -> {//模擬外部調(diào)用,5秒后通過設置isInterrupted來取消任務,也可以把這段代碼放到一個新的cancel方法中
            sleep(5000);
            isInterrupted = true;
        }).start();
        try {
            DownloadTask task = new DownloadTask();
            task.download(new DownloadTask.Listener() {
                @Override
                public void onProgressUpdated(int progress) {
                    System.out.println("onProgressUpdated: " + progress);
                    if (isInterrupted) {
                        throw new EndException();
                    }
                }
                @Override
                public void onCompleted() {
                    System.out.println("onCompleted...");
                }
            });
        }catch (EndException e){
            System.out.println("end...");
            //is interrupted, ignore
        }
        Thread.currentThread().join();
    }
    static class EndException extends RuntimeException {
    }
    public static void sleep(long time) {
        try {
            Thread.sleep(time);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}

場景2:任務另起子線程的情況

如果任務另起子線程來執(zhí)行,那么就沒法直接用try-catch來捕獲異常,那么就得通過線程的UncaughtExceptionHandler來完成。假如下載的代碼是這樣的:

public class DownloadTask {
    public void download(Listener listener) {
        new Thread(() -> {
            try {
                for (int i = 0; i < 100; i++) {//模擬下載過程
                    Thread.sleep(1000);
                    listener.onProgressUpdated(i + 1);
                }
                listener.onCompleted();
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }).start();
    }
    public interface Listener {
        void onProgressUpdated(int progress);
        void onCompleted();
    }
}

那么外部調(diào)用并終止的代碼就是:

public class Main {
    private static volatile boolean isInterrupted;
    public static void main(String[] args) throws InterruptedException {
        Thread.UncaughtExceptionHandler handler = (t, e) -> {
            if(e instanceof EndException){
                System.out.println("end...");
                //is interrupted, ignore
            }
        };
        DownloadTask task = new DownloadTask();
        task.download(new DownloadTask.Listener() {
            @Override
            public void onProgressUpdated(int progress) {
                System.out.println("onProgressUpdated: " + progress);
                if(Thread.currentThread().getUncaughtExceptionHandler() != handler){//注意這里
                    Thread.currentThread().setUncaughtExceptionHandler(handler);
                }
                if (isInterrupted) {
                    throw new EndException();
                }
            }
            @Override
            public void onCompleted() {
                System.out.println("onCompleted...");
            }
        });
        sleep(5000);
        isInterrupted = true;
        Thread.currentThread().join();
    }
    public static class EndException extends RuntimeException {
    }
    public static void sleep(long time) {
        try {
            Thread.sleep(time);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}

寫在最后

大家也能看到,這并不是什么萬能的方法,甚至有很大局限,但碰到合適的場景還是可以通過簡短的代碼來解決問題。

到此這篇關于Java利用異常中斷當前任務的技巧分享的文章就介紹到這了,更多相關Java中斷任務內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java黑盒測試之nextDate函數(shù)測試

    Java黑盒測試之nextDate函數(shù)測試

    這篇文章主要介紹了Java黑盒測試之nextDate函數(shù)測試,文中有非常詳細的代碼示例,對正在學習Java黑盒測試的小伙伴們有很大的幫助哦,需要的朋友可以參考下
    2021-05-05
  • springboot+mybatis-plus 兩種方式打印sql語句的方法

    springboot+mybatis-plus 兩種方式打印sql語句的方法

    這篇文章主要介紹了springboot+mybatis-plus 兩種方式打印sql語句的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • 打包部署若依(RuoYi)SpringBoot后端和Vue前端圖文教程

    打包部署若依(RuoYi)SpringBoot后端和Vue前端圖文教程

    若依是一個使用Spring Boot作為后端和Vue.js作為前端的全棧應用開發(fā)平臺,下面這篇文章主要給大家介紹了關于打包部署若依(RuoYi)SpringBoot后端和Vue前端的相關資料,需要的朋友可以參考下
    2024-05-05
  • Java如何實現(xiàn)圖片的疊加與拼接操作

    Java如何實現(xiàn)圖片的疊加與拼接操作

    這篇文章主要介紹了Java如何實現(xiàn)圖片的疊加與拼接操作,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • Java多線程通訊之wait,notify的區(qū)別詳解

    Java多線程通訊之wait,notify的區(qū)別詳解

    這篇文章主要介紹了Java多線程通訊之wait,notify的區(qū)別詳解,非常不錯,具有一定的參考借鑒借鑒價值,需要的朋友可以參考下
    2018-07-07
  • Java內(nèi)存區(qū)域與內(nèi)存溢出異常分析與解決

    Java內(nèi)存區(qū)域與內(nèi)存溢出異常分析與解決

    在?Java?開發(fā)中,內(nèi)存管理和內(nèi)存溢出異常是一個至關重要的主題,本文將深入探討?Java?的內(nèi)存區(qū)域及其對應的內(nèi)存溢出異常,希望對大家有所幫助
    2025-05-05
  • Springboot2 session設置超時時間無效的解決

    Springboot2 session設置超時時間無效的解決

    這篇文章主要介紹了Springboot2 session設置超時時間無效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • JAVA?IDEA項目打包為jar包的步驟詳解

    JAVA?IDEA項目打包為jar包的步驟詳解

    在Java開發(fā)中我們通常會將我們的項目打包成可執(zhí)行的Jar包,以便于在其他環(huán)境中部署和運行,下面這篇文章主要給大家介紹了關于JAVA?IDEA項目打包為jar包的相關資料,需要的朋友可以參考下
    2024-08-08
  • Java+Swing實現(xiàn)中國象棋游戲

    Java+Swing實現(xiàn)中國象棋游戲

    這篇文章將通過Java+Swing實現(xiàn)經(jīng)典的中國象棋游戲。文中可以實現(xiàn)開始游戲,悔棋,退出等功能。感興趣的小伙伴可以跟隨小編一起動手試一試
    2022-02-02
  • Spring Cloud Alibaba Nacos Config配置中心實現(xiàn)

    Spring Cloud Alibaba Nacos Config配置中心實現(xiàn)

    這篇文章主要介紹了Spring Cloud Alibaba Nacos Config配置中心實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04

最新評論

乌拉特中旗| 晋城| 泊头市| 绥阳县| 镇坪县| 大新县| 工布江达县| 张家界市| 资兴市| 上蔡县| 黄龙县| 腾冲县| 皮山县| 仙桃市| 巨鹿县| 盈江县| 渝中区| 眉山市| 桐梓县| 七台河市| 东阳市| 青铜峡市| 大石桥市| 鹤山市| 鹤岗市| 根河市| 新野县| 湟中县| 类乌齐县| 阆中市| 都安| 剑阁县| 奈曼旗| 上饶县| 六枝特区| 车险| 临安市| 清水县| 安徽省| 福泉市| 灵川县|