您好,登錄后才能下訂單哦!
本篇內容主要講解“Java中怎么使用同步回調和異步回調”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Java中怎么使用同步回調和異步回調”吧!
同步回調函數將始終在執行某些操作后立即執行。這意味著它將與執行該操作的函數同步。
在觀察者設計模式中可以找到回調函數的示例。在需要單擊按鈕以啟動某些操作的應用界面中,我們可以將回調函數作為該按鈕單擊的監聽器傳遞。監聽器函數等待按鈕被單擊,然后執行監聽器回調。
每當我們將帶有方法實現的接口傳遞給 Java 中的另一個方法時,我們都在使用回調函數的概念。在下面的代碼中,我們將通過 Consumer 功能接口和一個匿名內部類(沒有名稱的實現)來實現 accept() 方法。
實現 accept() 方法后,我們將執行 performAction 方法中的操作;然后我們將從 Consumer 接口執行 accept() 方法:
import java.util.function.Consumer; /** * 同步場景下匿名內部類的方式實現回調 * * @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("執行特定的業務邏輯"); consumer.accept("回調代碼被執行"); } }
在這段代碼中,我們將 Consumer 接口傳遞給 performAction() 方法,然后在操作完成后調用 accept() 方法。
觀察上面的代碼可能還會注意到使用匿名內部類非常冗長。改用 lambda 會好得多。
/** * 同步場景下匿名內部類的方式實現回調(Lambda寫法) * * @author zhangyu * @date 2023/4/16 */ public class LambdaCallback { public static void main(String[] args) { performAction(() -> System.out.println("回調代碼被執行")); } public static void performAction(Runnable runnable) { System.out.println("執行特定的業務邏輯"); runnable.run(); } }
輸出再次表明正在執行操作并執行回調。
通常,我們希望使用異步回調方法,這意味著將在操作之后調用但與其他線程異步調用的方法。當不需要在其他線程之后立即調用回調方法時,這可能有助于提高性能。
在下面的代碼中,首先我們將從 Runnable 功能接口實現 run() 方法。然后,我們將創建一個 Thread 并使用我們剛剛在 Thread 中實現的 run() 方法。最后,我們啟動線程異步執行:
/ /** * 異步回調實例 * * @author zhangyu * @date 2023/4/16 */ public class AsynchronousCallback { public static void main(String[] args) { Runnable runnable = () -> System.out.println("回調代碼被執行"); AsynchronousCallback asynchronousCallback = new AsynchronousCallback(); asynchronousCallback.performAsynchronousAction(runnable); } public void performAsynchronousAction(Runnable runnable) { new Thread(() -> { System.out.println("執行異步操作代碼"); runnable.run(); }).start(); } }
在上面的代碼中,首先我們為 Runnable 中的 run() 方法創建了一個實現。然后,我們調用了 performAsynchronousAction() 方法,傳遞帶有 run() 方法實現的可運行功能接口。 在 performAsynchronousAction() 中,我們傳遞 runnable 接口并使用 lambda 在 Thread 中實現另一個 Runnable 接口。
除了在異步操作中調用回調函數之外,我們還可以在調用另一個函數的同時調用回調函數。這意味著我們可以啟動兩個線程并并行調用這些方法。 代碼將與前面的示例類似,但請注意,我們將啟動一個新線程并在這個新線程中調用回調函數,而不是直接調用回調函數:
/** * 異步并行回調 * * @author zhangyu * @date 2023/4/16 */ public class AsynchronousParallelCallback { public void performAsynchronousAction(Runnable runnable) { new Thread(() -> { System.out.println("執行異步操作代碼"); // 創建一個新的線程執行回調 new Thread(runnable).start(); }).start(); } public static void main(String[] args) { Runnable runnable = () -> System.out.println("回調代碼被執行"); AsynchronousParallelCallback callback = new AsynchronousParallelCallback(); callback.performAsynchronousAction(runnable); } }
當我們不需要在 performAsynchronousAction() 方法的操作之后立即執行回調函數時,異步并行回調很有用。 一個真實的例子是當我們在線購買產品時,我們不需要等到確認付款、檢查庫存以及所有那些繁重的流程。在這種情況下,我們可以在后臺執行回調調用的同時做其他事情。CompletableFuture 回調
另一種使用異步回調函數的方法是使用 CompletableFuture API。這個強大的 API 在 Java 8 中引入,有助于執行和組合異步方法調用。它完成了我們在前面的示例中所做的一切,例如創建一個新線程然后啟動和管理它。 在下面的代碼示例中,我們將創建一個新的 CompletableFuture,然后我們將調用傳遞字符串的 supplyAsync 方法。 接下來,我們將創建另一個 CompletableFuture,然后應用一個回調函數來執行我們配置的第一個函數:
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("執行業務代碼"); try { Thread.sleep(2000); } catch (InterruptedException e) { throw new RuntimeException(e); } System.out.println("執行業務代碼結束"); return "ok"; }); CompletableFuture<String> execution = completableFuture .thenApply(s -> s + "回調被執行"); System.out.println("main線程執行代碼"); System.out.println(execution.get()); } }
注意在上面的代碼示例中,CompletableFuture開啟了一個新的線程,因此其對應的代碼是在新的線程中執行的,因為代碼中Thread.sleep(2000);所以main線程執行代碼內容先打印了出來。再者可以看到在CompletableFuture執行代碼和后面的回調代碼是按照順序執行的。
到此,相信大家對“Java中怎么使用同步回調和異步回調”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。