溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java中怎么使用同步回調(diào)和異步回調(diào)

發(fā)布時(shí)間:2023-04-18 16:14:52 來源:億速云 閱讀:97 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容主要講解“Java中怎么使用同步回調(diào)和異步回調(diào)”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Java中怎么使用同步回調(diào)和異步回調(diào)”吧!

(一)同步回調(diào)

同步回調(diào)函數(shù)將始終在執(zhí)行某些操作后立即執(zhí)行。這意味著它將與執(zhí)行該操作的函數(shù)同步。
在觀察者設(shè)計(jì)模式中可以找到回調(diào)函數(shù)的示例。在需要單擊按鈕以啟動某些操作的應(yīng)用界面中,我們可以將回調(diào)函數(shù)作為該按鈕單擊的監(jiān)聽器傳遞。監(jiān)聽器函數(shù)等待按鈕被單擊,然后執(zhí)行監(jiān)聽器回調(diào)。

(1)匿名內(nèi)部類回調(diào)

每當(dāng)我們將帶有方法實(shí)現(xiàn)的接口傳遞給 Java 中的另一個(gè)方法時(shí),我們都在使用回調(diào)函數(shù)的概念。在下面的代碼中,我們將通過 Consumer 功能接口和一個(gè)匿名內(nèi)部類(沒有名稱的實(shí)現(xiàn))來實(shí)現(xiàn) accept() 方法。
實(shí)現(xiàn) accept() 方法后,我們將執(zhí)行 performAction 方法中的操作;然后我們將從 Consumer 接口執(zhí)行 accept() 方法:

import java.util.function.Consumer;

/**
 * 同步場景下匿名內(nèi)部類的方式實(shí)現(xiàn)回調(diào)
 *
 * @author zhangyu
 * @date 2023/4/16
 */
public class AnonymousClassCallback {

    public static void main(String[] args) {
        performAction(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        });
    }

    public static void performAction(Consumer<String> consumer) {
        System.out.println("執(zhí)行特定的業(yè)務(wù)邏輯");
        consumer.accept("回調(diào)代碼被執(zhí)行");
    }
}

Java中怎么使用同步回調(diào)和異步回調(diào)

在這段代碼中,我們將 Consumer 接口傳遞給 performAction() 方法,然后在操作完成后調(diào)用 accept() 方法。

(2)Lambda 回調(diào)

觀察上面的代碼可能還會注意到使用匿名內(nèi)部類非常冗長。改用 lambda 會好得多。

/**
 * 同步場景下匿名內(nèi)部類的方式實(shí)現(xiàn)回調(diào)(Lambda寫法)
 *
 * @author zhangyu
 * @date 2023/4/16
 */
public class LambdaCallback {
    public static void main(String[] args) {
        performAction(() -> System.out.println("回調(diào)代碼被執(zhí)行"));
    }

    public static void performAction(Runnable runnable) {
        System.out.println("執(zhí)行特定的業(yè)務(wù)邏輯");
        runnable.run();
    }
}

輸出再次表明正在執(zhí)行操作并執(zhí)行回調(diào)。

(二)異步回調(diào)

通常,我們希望使用異步回調(diào)方法,這意味著將在操作之后調(diào)用但與其他線程異步調(diào)用的方法。當(dāng)不需要在其他線程之后立即調(diào)用回調(diào)方法時(shí),這可能有助于提高性能。

(1)簡單的線程回調(diào)

在下面的代碼中,首先我們將從 Runnable 功能接口實(shí)現(xiàn) run() 方法。然后,我們將創(chuàng)建一個(gè) Thread 并使用我們剛剛在 Thread 中實(shí)現(xiàn)的 run() 方法。最后,我們啟動線程異步執(zhí)行:

/
/**
 * 異步回調(diào)實(shí)例
 *
 * @author zhangyu
 * @date 2023/4/16
 */
public class AsynchronousCallback {

    public static void main(String[] args) {
        Runnable runnable = () -> System.out.println("回調(diào)代碼被執(zhí)行");
        AsynchronousCallback asynchronousCallback = new AsynchronousCallback();
        asynchronousCallback.performAsynchronousAction(runnable);
    }

    public void performAsynchronousAction(Runnable runnable) {
        new Thread(() -> {
            System.out.println("執(zhí)行異步操作代碼");
            runnable.run();
        }).start();
    }

}

Java中怎么使用同步回調(diào)和異步回調(diào)

在上面的代碼中,首先我們?yōu)?Runnable 中的 run() 方法創(chuàng)建了一個(gè)實(shí)現(xiàn)。然后,我們調(diào)用了 performAsynchronousAction() 方法,傳遞帶有 run() 方法實(shí)現(xiàn)的可運(yùn)行功能接口。 在 performAsynchronousAction() 中,我們傳遞 runnable 接口并使用 lambda 在 Thread 中實(shí)現(xiàn)另一個(gè) Runnable 接口。

(2)異步并行回調(diào)

除了在異步操作中調(diào)用回調(diào)函數(shù)之外,我們還可以在調(diào)用另一個(gè)函數(shù)的同時(shí)調(diào)用回調(diào)函數(shù)。這意味著我們可以啟動兩個(gè)線程并并行調(diào)用這些方法。 代碼將與前面的示例類似,但請注意,我們將啟動一個(gè)新線程并在這個(gè)新線程中調(diào)用回調(diào)函數(shù),而不是直接調(diào)用回調(diào)函數(shù):

/**
 * 異步并行回調(diào)
 *
 * @author zhangyu
 * @date 2023/4/16
 */
public class AsynchronousParallelCallback {

    public void performAsynchronousAction(Runnable runnable) {

        new Thread(() -> {
            System.out.println("執(zhí)行異步操作代碼");
            // 創(chuàng)建一個(gè)新的線程執(zhí)行回調(diào)
            new Thread(runnable).start();
        }).start();
    }

    public static void main(String[] args) {
        Runnable runnable = () -> System.out.println("回調(diào)代碼被執(zhí)行");
        AsynchronousParallelCallback callback = new AsynchronousParallelCallback();
        callback.performAsynchronousAction(runnable);
    }
}

當(dāng)我們不需要在 performAsynchronousAction() 方法的操作之后立即執(zhí)行回調(diào)函數(shù)時(shí),異步并行回調(diào)很有用。 一個(gè)真實(shí)的例子是當(dāng)我們在線購買產(chǎn)品時(shí),我們不需要等到確認(rèn)付款、檢查庫存以及所有那些繁重的流程。在這種情況下,我們可以在后臺執(zhí)行回調(diào)調(diào)用的同時(shí)做其他事情。CompletableFuture 回調(diào)

(3)CompletableFuture 回調(diào)

另一種使用異步回調(diào)函數(shù)的方法是使用 CompletableFuture API。這個(gè)強(qiáng)大的 API 在 Java 8 中引入,有助于執(zhí)行和組合異步方法調(diào)用。它完成了我們在前面的示例中所做的一切,例如創(chuàng)建一個(gè)新線程然后啟動和管理它。 在下面的代碼示例中,我們將創(chuàng)建一個(gè)新的 CompletableFuture,然后我們將調(diào)用傳遞字符串的 supplyAsync 方法。 接下來,我們將創(chuàng)建另一個(gè) CompletableFuture,然后應(yīng)用一個(gè)回調(diào)函數(shù)來執(zhí)行我們配置的第一個(gè)函數(shù):

import java.util.concurrent.CompletableFuture;

/**
 * CompletableFuture callback
 *
 * @author zhangyu
 * @date 2023/4/16
 */
public class CompletableFutureCallback {
    public static void main(String[] args) throws Exception {
        CompletableFuture<String> completableFuture
                = CompletableFuture.supplyAsync(() -> {
            System.out.println("執(zhí)行業(yè)務(wù)代碼");
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println("執(zhí)行業(yè)務(wù)代碼結(jié)束");
            return "ok";
        });

        CompletableFuture<String> execution = completableFuture
                .thenApply(s -> s + "回調(diào)被執(zhí)行");
        System.out.println("main線程執(zhí)行代碼");
        System.out.println(execution.get());
    }
}

Java中怎么使用同步回調(diào)和異步回調(diào)

注意在上面的代碼示例中,CompletableFuture開啟了一個(gè)新的線程,因此其對應(yīng)的代碼是在新的線程中執(zhí)行的,因?yàn)榇a中Thread.sleep(2000);所以main線程執(zhí)行代碼內(nèi)容先打印了出來。再者可以看到在CompletableFuture執(zhí)行代碼和后面的回調(diào)代碼是按照順序執(zhí)行的。

到此,相信大家對“Java中怎么使用同步回調(diào)和異步回調(diào)”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI