更新時(shí)間:2022-06-27 10:44:26 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽2750次
在本文中,動(dòng)力節(jié)點(diǎn)小白將告訴大家如何在 Java 中異步調(diào)用函數(shù)。
首先,我們將了解一些 Java 內(nèi)置的異步編程工具,例如 FutureTask 和 CompletableFuture。然后我們將了解一些提供開(kāi)箱即用解決方案的庫(kù),例如 EA Async 和 Cactoos。
我們可以開(kāi)始一個(gè)新線程來(lái)執(zhí)行任何異步操作。它更容易理解。
讓我們創(chuàng)建一個(gè)添加兩個(gè)整數(shù)并打印結(jié)果的新線程:
class example {
public static void main(String[] args) {
int num1 = 4;
int num2 = 5;
int result=num1+num2;
Thread T = new Thread(() -> {
System.out.println("Addition of " + num1 + " and " + num2 + " is " + result);});
T.start();
}
}
Future 接口允許您使用FutureTask. 我們可以使用 的 submit 方法ExecutorService來(lái)異步運(yùn)行項(xiàng)目并返回一個(gè)FutureTask對(duì)象。
例如,這里是如何找到一個(gè)數(shù)字的階乘:
int num1 = 9;
ExecutorService tp = Executors.newCachedThreadPool();
Future<double> futureTask = tp.submit(() -> factorial(num1));
while (!futureTask.isDone()) {
System.out.println("Still processing the task");
}
double result = futureTask.get();
tp.shutdown();
我們已經(jīng)利用 Future 接口的isDone功能來(lái)查看工作是否已經(jīng)完成。之后,我們使用get方法來(lái)獲取結(jié)果。
作為 和 的混合體Future,在 Java 8CompletionStage中CompletableFuture引入。它具有異步編程技術(shù),例如supplyAsync、runAsync和thenApplyAsync。
ACompletionStage是一個(gè)承諾。它保證計(jì)算將在某個(gè)時(shí)候完成。
這CompletionStage很有用,因?yàn)樗峁┝藥追N方法來(lái)附加要在階段完成時(shí)執(zhí)行的回調(diào)。
讓我們從頭開(kāi)始,做一個(gè)簡(jiǎn)單的異步計(jì)算。
CompletableFuture.supplyAsync(this::sendMsg);
就這么簡(jiǎn)單,該supplyAsync函數(shù)接受一個(gè)包含異步代碼的供應(yīng)商。我們希望sendMsg在這個(gè)例子中使用這個(gè)函數(shù)。
CompletableFuture.supplyAsync(this::sendMsg).thenAccept(this::notify);
在第一個(gè)示例中,我們執(zhí)行sendMsg異步發(fā)送消息。所以讓我們添加一個(gè)回調(diào)來(lái)提醒我們消息的傳遞狀態(tài)。
可以通過(guò)多種方式引入回調(diào);一種方法是使用thenAccept. 在此示例中,它需要通知用戶(hù)一旦完成就處理先前計(jì)算的結(jié)果。
這是 Java 的另一個(gè)特性,它允許您逐步編寫(xiě)異步代碼,從而使編程和擴(kuò)展變得更加容易。Electronic Arts 是 async-await 功能的創(chuàng)建者,該功能可通過(guò) ea-async 包在 Java 環(huán)境中使用。
此功能轉(zhuǎn)換運(yùn)行時(shí)代碼并重寫(xiě) await 方法調(diào)用,與completeableFuture.
所以我們可以使用EA-sync被稱(chēng)為await方法的方法來(lái)實(shí)現(xiàn)上面的completeableFuture代碼,通過(guò)調(diào)用Async.init函數(shù)來(lái)初始化Async運(yùn)行時(shí)。
在這里,我們將使用 EAAsync類(lèi)提供的 await 函數(shù)來(lái)修改前面描述的CompletableFuture代碼:
static {Async.init();}
為了設(shè)置Async運(yùn)行時(shí)分析,我們使用Async.init靜態(tài)函數(shù)。
public double example2 (int num1) {
CompletableFuture<double> cf = CompletableFuture.supplyAsync(() -> factorial(num1));
double result = Async.await(cf);
}
在運(yùn)行時(shí),該async函數(shù)會(huì)更改代碼并重寫(xiě)await方法調(diào)用以類(lèi)似地操作,使用CompletableFuture.
對(duì)于異步任務(wù),這個(gè)庫(kù)提供了一個(gè)Async類(lèi)。Cactoos 庫(kù)具有廣泛的曲目,從文本操作到數(shù)據(jù)結(jié)構(gòu)。
該庫(kù)的原始類(lèi)型和功能與其他庫(kù)(如 Guava 和 Apache Commons)提供的類(lèi)似,盡管它們更側(cè)重于面向?qū)ο蟮脑O(shè)計(jì)概念。
在這里,使用 CactoosAsync類(lèi)的一個(gè)實(shí)例,我們將找到一個(gè)數(shù)字的階乘。
Async<Integer, Double> a = new Async<Integer, Double>(inputdata -> factorial(inputdata));
Future<Double> asyncFuture = a.apply(num1);
Double result = asyncFuture.get();
該apply函數(shù)使用該ExecutorService.submit方法執(zhí)行并返回一個(gè) Future 接口對(duì)象。Cactoos 庫(kù)提供的類(lèi)執(zhí)行與 Apache Commons 庫(kù)中的靜態(tài)方法相同的功能。
相關(guān)閱讀
Java實(shí)驗(yàn)班
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
Java就業(yè)班
有基礎(chǔ) 直達(dá)就業(yè)
Java夜校直播班
業(yè)余時(shí)間 高薪轉(zhuǎn)行
Java在職加薪班
工作1~3年,加薪神器
Java架構(gòu)師班
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)