国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

以?xún)煞N異步模型應用案例,深度解析Future接口

發(fā)布時(shí)間:2021-07-31 23:47 來(lái)源:https://blog.51cto.com/u_15214 閱讀:199 作者:華為云開(kāi)發(fā)者社區 欄目: 云計算 歡迎投稿:712375056

本文以實(shí)際案例的形式分析了兩種異步模型,并從源碼角度深度解析Future接口和FutureTask類(lèi),希望大家踏下心來(lái),打開(kāi)你的IDE,跟著(zhù)文章看源碼,相信你一定收獲不??!

一、兩種異步模型

在Java的并發(fā)編程中,大體上會(huì )分為兩種異步編程模型,一類(lèi)是直接以異步的形式來(lái)并行運行其他的任務(wù),不需要返回任務(wù)的結果數據。一類(lèi)是以異步的形式運行其他任務(wù),需要返回結果。

1.無(wú)返回結果的異步模型

無(wú)返回結果的異步任務(wù),可以直接將任務(wù)丟進(jìn)線(xiàn)程或線(xiàn)程池中運行,此時(shí),無(wú)法直接獲得任務(wù)的執行結果數據,一種方式是可以使用回調方法來(lái)獲取任務(wù)的運行結果。

具體的方案是:定義一個(gè)回調接口,并在接口中定義接收任務(wù)結果數據的方法,具體邏輯在回調接口的實(shí)現類(lèi)中完成。將回調接口與任務(wù)參數一同放進(jìn)線(xiàn)程或線(xiàn)程池中運行,任務(wù)運行后調用接口方法,執行回調接口實(shí)現類(lèi)中的邏輯來(lái)處理結果數據。這里,給出一個(gè)簡(jiǎn)單的示例供參考。

定義回調接口

package io.binghe.concurrent.lab04; /** * @author binghe * @version 1.0.0 * @description 定義回調接口 */ public interface TaskCallable<T> { T callable(T t); }

便于接口的通用型,這里為回調接口定義了泛型。

定義任務(wù)結果數據的封裝類(lèi)

package io.binghe.concurrent.lab04; import java.io.Serializable; /** * @author binghe * @version 1.0.0 * @description 任務(wù)執行結果 */ public class TaskResult implements Serializable { private static final long serialVersionUID = 8678277072402730062L; /** * 任務(wù)狀態(tài) */ private Integer taskStatus; /** * 任務(wù)消息 */ private String taskMessage; /** * 任務(wù)結果數據 */ private String taskResult; //省略getter和setter方法 @Override public String toString() { return "TaskResult{" + "taskStatus=" + taskStatus + ", taskMessage='" + taskMessage + 'http://blog.51cto.com/u_15214399/3230109/\'' + ", taskResult='" + taskResult + 'http://blog.51cto.com/u_15214399/3230109/\'' + '}'; } }

創(chuàng )建回調接口的實(shí)現類(lèi)

回調接口的實(shí)現類(lèi)主要用來(lái)對任務(wù)的返回結果進(jìn)行相應的業(yè)務(wù)處理,這里,為了方便演示,只是將結果數據返回。大家需要根據具體的業(yè)務(wù)場(chǎng)景來(lái)做相應的分析和處理。

package io.binghe.concurrent.lab04; /** * @author binghe * @version 1.0.0 * @description 回調函數的實(shí)現類(lèi) */ public class TaskHandler implements TaskCallable<TaskResult> { @Override public TaskResult callable(TaskResult taskResult) { //TODO 拿到結果數據后進(jìn)一步處理 System.out.println(taskResult.toString()); return taskResult; } }

創(chuàng )建任務(wù)的執行類(lèi)

任務(wù)的執行類(lèi)是具體執行任務(wù)的類(lèi),實(shí)現Runnable接口,在此類(lèi)中定義一個(gè)回調接口類(lèi)型的成員變量和一個(gè)String類(lèi)型的任務(wù)參數(模擬任務(wù)的參數),并在構造方法中注入回調接口和任務(wù)參數。在run方法中執行任務(wù),任務(wù)完成后將任務(wù)的結果數據封裝成TaskResult對象,調用回調接口的方法將TaskResult對象傳遞到回調方法中。

package io.binghe.concurrent.lab04; /** * @author binghe * @version 1.0.0 * @description 任務(wù)執行類(lèi) */ public class TaskExecutor implements Runnable{ private TaskCallable<TaskResult> taskCallable; private String taskParameter; public TaskExecutor(TaskCallable<TaskResult> taskCallable, String taskParameter){ this.taskCallable = taskCallable; this.taskParameter = taskParameter; } @Override public void run() { //TODO 一系列業(yè)務(wù)邏輯,將結果數據封裝成TaskResult對象并返回 TaskResult result = new TaskResult(); result.setTaskStatus(1); result.setTaskMessage(this.taskParameter); result.setTaskResult("異步回調成功"); taskCallable.callable(result); } }

到這里,整個(gè)大的框架算是完成了,接下來(lái),就是測試看能否獲取到異步任務(wù)的結果了。

異步任務(wù)測試類(lèi)

package io.binghe.concurrent.lab04; /** * @author binghe * @version 1.0.0 * @description 測試回調 */ public class TaskCallableTest { public static void main(String[] args){ TaskCallable<TaskResult> taskCallable = new TaskHandler(); TaskExecutor taskExecutor = new TaskExecutor(taskCallable, "測試回調任務(wù)"); new Thread(taskExecutor).start(); } }

在測試類(lèi)中,使用Thread類(lèi)創(chuàng )建一個(gè)新的線(xiàn)程,并啟動(dòng)線(xiàn)程運行任務(wù)。運行程序最終的接口數據如下所示。

TaskResult{taskStatus=1, taskMessage='測試回調任務(wù)', taskResult='異步回調成功'}

大家可以細細品味下這種獲取異步結果的方式。這里,只是簡(jiǎn)單的使用了Thread類(lèi)來(lái)創(chuàng )建并啟動(dòng)線(xiàn)程,也可以使用線(xiàn)程池的方式實(shí)現。大家可自行實(shí)現以線(xiàn)程池的方式通過(guò)回調接口獲取異步結果。

2.有返回結果的異步模型

盡管使用回調接口能夠獲取異步任務(wù)的結果,但是這種方式使用起來(lái)略顯復雜。在JDK中提供了可以直接返回異步結果的處理方案。最常用的就是使用Future接口或者其實(shí)現類(lèi)FutureTask來(lái)接收任務(wù)的返回結果。

使用Future接口獲取異步結果

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。

亚洲国产精品毛片AV不卡在线| 久久99精品久久久久免费| 亚洲AV中文无码乱人伦在线R▽| 亚洲AV本道一区二区三区四区| 精品国产三级A∨在线无码| 乌克兰少妇xxxx做受野外|