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

Java中的異步回調(diào)問題

 更新時間:2023年12月20日 08:44:07   作者:bat在等我  
這篇文章主要介紹了Java中的異步回調(diào)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

有時候我們執(zhí)行一個任務(wù)需要很長時間,單線程環(huán)境下 會處于阻塞狀態(tài),嚴(yán)重影響效率,那么可以使用一種非阻塞的處理方式,這就是使用多線程。

多線程情況下,問題出來了,我們不知道線程什么時候執(zhí)行完畢,或者不知道如何處理子線程的結(jié)果

那么就有以下兩種方式:異步回調(diào)同步等待線程處理結(jié)果兩種方式

1. 異步回調(diào)

直接上代碼,固定格式:主業(yè)務(wù)代碼和一個處理結(jié)果的接口

/**
 * Callback
 * 回調(diào)一般是異步處理的一種技術(shù)。
 * 一個回調(diào)是被傳遞到并且執(zhí)行完該方法。 這種方式只能異步回調(diào),
 * 如果需要同步等待線程處理結(jié)果可以使用下面介紹的Futures
 */
interface MyCallback {

    void doCallback(Map<String, Object> params);
}

public class TestAsyncCallBack {

    static ExecutorService es = Executors.newFixedThreadPool(2);

    public static void doSomething(MyCallback callback) {
        // 初始化一個線程  
        Thread t = new Thread() {
            public void run() {

                // 這里是業(yè)務(wù)邏輯處理  
                System.out.println("子線任務(wù)開始執(zhí)行:" + Thread.currentThread().getId());
                // 為了能看出效果 ,讓當(dāng)前線程阻塞5秒  
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("子線任務(wù)結(jié)束執(zhí)行:");
                // 處理完業(yè)務(wù)邏輯,  
                Map<String, Object> params = new HashMap<String, Object>();
                params.put("a1", "子線程處理結(jié)果");
                callback.doCallback(params);
            }
        };
        es.execute(t);
        //一定要調(diào)用這個方法,不然executorService.isTerminated()永遠不為true
        es.shutdown();
    }

    public static void main(String[] args) {
        // 內(nèi)部類 等價于 new MyCallBack(){...}, 主要作用就是重寫doCallback方法
        doSomething((params) -> {
            System.out.println("單個線程也已經(jīng)處理完畢了,返回參數(shù)a1=" + params.get("a1"));
        });

        System.out.println("主線任務(wù)已經(jīng)執(zhí)行完了:" + Thread.currentThread().getId());
    }
}

2. 使用Future同步等待執(zhí)行結(jié)果

主要是利用了Callable接口開啟進行多線程,call方法可以返回結(jié)果

/**
 * Futures是一個抽象的概念,它表示一個值,該值可能在某一點變得可用。一個Future要么獲得計算完的結(jié)果,要么獲得計算失敗后的異常
 * 每傳遞一個Runnable對象到ExecutorService.submit()方法就會得到一個回調(diào)的Future,你能使用它檢測是否執(zhí)行,這種方法可以是同步等待線處理結(jié)果
 */
public class TestFuture {
    public static void main(String[] args) {
        Callable<Result> callable = new Callable<Result>() {
            @Override
            public Result call() throws Exception {
                //這里是業(yè)務(wù)邏輯處理
                //讓當(dāng)前線程阻塞1秒看下效果
                Thread.sleep(5000);
                return new Result("張三");
            }
        };
        ExecutorService executorService = Executors.newFixedThreadPool(5);

        Future<Result> resultFuture = executorService.submit(callable);
        executorService.shutdown();

        /**
         * 無限循環(huán)等待任務(wù)處理完畢  如果已經(jīng)處理完畢 isDone返回true
         */
        while (!resultFuture.isDone()) {
            try {
                Result result = resultFuture.get(); // 在這一步阻塞知直到得到子線程返回結(jié)果
                System.out.println(result.getName());
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        }
    }
}

class Result {

    private String name;

    public Result(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java實現(xiàn)一個簡單的線程池代碼示例

    Java實現(xiàn)一個簡單的線程池代碼示例

    線程池是管理線程的一個池子,通過阻塞隊列管理任務(wù),主要參數(shù)包括corePoolSize、maximumPoolSize、keepAliveTime等,這篇文章主要介紹了Java實現(xiàn)一個簡單的線程池的相關(guān)資料,需要的朋友可以參考下
    2024-09-09
  • java內(nèi)部類使用總結(jié)

    java內(nèi)部類使用總結(jié)

    本文主要介紹了java內(nèi)部類使用總結(jié)。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • mybatis+springboot發(fā)布postgresql數(shù)據(jù)的實現(xiàn)

    mybatis+springboot發(fā)布postgresql數(shù)據(jù)的實現(xiàn)

    本文主要介紹了mybatis+springboot發(fā)布postgresql數(shù)據(jù)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-11-11
  • 基于selenium 獲取新頁面元素失敗的解決方法

    基于selenium 獲取新頁面元素失敗的解決方法

    今天小編就為大家分享一篇基于selenium 獲取新頁面元素失敗的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • Java?Calendar類使用之日期和時間處理指南

    Java?Calendar類使用之日期和時間處理指南

    這篇文章主要給大家介紹了關(guān)于Java?Calendar類使用之日期和時間處理指南的相關(guān)資料,Calendar類是Java中用于處理日期和時間的抽象類,它提供了一種獨立于特定日歷系統(tǒng)的方式來處理日期和時間,需要的朋友可以參考下
    2023-12-12
  • EntityWrapper如何在and條件中嵌套or語句

    EntityWrapper如何在and條件中嵌套or語句

    這篇文章主要介紹了EntityWrapper如何在and條件中嵌套or語句,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • SpringBoot整合Redis實現(xiàn)高并發(fā)數(shù)據(jù)緩存的示例講解

    SpringBoot整合Redis實現(xiàn)高并發(fā)數(shù)據(jù)緩存的示例講解

    這篇文章主要介紹了SpringBoot整合Redis實現(xiàn)高并發(fā)數(shù)據(jù)緩存,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • springboot配置文件使用方式

    springboot配置文件使用方式

    文章介紹了將參數(shù)配置在配置文件中的方法,包括使用@Component和@Value注解進行外部配置的屬性注入,以及使用@ConfigurationProperties簡化配置,文章還提供了YAML格式配置文件的語法和特點,并強調(diào)了集中管理和維護配置參數(shù)的重要性
    2024-11-11
  • java中set接口使用方法詳解

    java中set接口使用方法詳解

    這篇文章主要為大家詳細介紹了java中set接口使用方法,介紹了Java中Set集合接口實現(xiàn)插入對象不重復(fù)的原理,感興趣的小伙伴們可以參考一下
    2016-05-05
  • Mybatis Plus條件構(gòu)造器ConditionConstructor用法實例解析

    Mybatis Plus條件構(gòu)造器ConditionConstructor用法實例解析

    這篇文章主要介紹了Mybatis Plus條件構(gòu)造器ConditionConstructor用法實例解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08

最新評論