Java異步編程之Callbacks與Futures模型詳解
一、Callbacks模型
該模型的異步方法,在異步任務(wù)完成之后調(diào)用,主線程沒有異步線程的結(jié)果。經(jīng)典模型如Swing’s EventListener模型(如果不了解可參考html如何實現(xiàn)button的click方法)
1.1示例
public class CallbackModel implements Callback, Runnable {
@Override
public void invoke() {
System.out.println("這是異步回調(diào)的結(jié)果");
}
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName() + "::異步線程任務(wù)開始");
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() + "::異步線程任務(wù)結(jié)束");
invoke();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName() + "::主線程開始");
new Thread(new CallbackModel(), "線程一").start();
System.out.println(Thread.currentThread().getName() + "::主線程結(jié)束");
}
}
interface Callback {
void invoke();
}
1.2運行結(jié)果
main::主線程開始
main::主線程結(jié)束
線程一::異步線程任務(wù)開始
線程一::異步線程任務(wù)結(jié)束
這是異步回調(diào)的結(jié)果
二、Futures模型
? 該模型的異步方法,立刻返回一個包裝了結(jié)果的返回值Future,T即是包裝的返回值,但返回值不可立即訪問(異步方法為完成),F(xiàn)uture對象包裝了對它的訪問??梢暂喸儗ο螅钡皆撝悼捎脼橹?。
2.1用例
public class FutureModel {
static class FutureTask implements Callable {
@Override
public Object call() {
try {
System.out.println(Thread.currentThread().getName() + "::異步線程任務(wù)開始");
Thread.sleep(4000);
System.out.println(Thread.currentThread().getName() + "::異步線程任務(wù)結(jié)束");
} catch (InterruptedException e) {
e.printStackTrace();
}
return "1234";
}
}
public static void main(String[] args) {
ExecutorService pool = Executors.newSingleThreadExecutor();
Future<String> submit = pool.submit(new FutureTask());
try {
System.out.println(Thread.currentThread().getName() + "返回的結(jié)果::" + submit.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}finally {
pool.shutdown();
}
}
}2.1用例結(jié)果
pool-1-thread-1::異步線程任務(wù)開始
pool-1-thread-1::異步線程任務(wù)結(jié)束
main返回的結(jié)果::1234
三、Future接口
/**
*異步計算的結(jié)果
*/
public interface Future<V> {
/**
* 嘗試取消任務(wù),有可能失敗
*/
boolean cancel(boolean mayInterruptIfRunning);
/**
* 判斷是否取消
*
* @return {@code true} if this task was cancelled before it completed
*/
boolean isCancelled();
/**
* * 判斷是否完成
*
* @return {@code true} if this task completed
*/
boolean isDone();
/**
* 等待直至獲取結(jié)果
*/
V get() throws InterruptedException, ExecutionException;
/**
* 等待指定的時間獲取結(jié)果,否則拋出異常
*/
V get(long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException;
}四、小結(jié)
1.兩種模型還是基于java的Runnable接口和Callable接口
2.Runnable接口配合Thread創(chuàng)建線程,通常不關(guān)注返回結(jié)果。
3.Callable接口配合Executors(java提供的線程池管理工具)與Future(封裝返回結(jié)果),常用場景是主線程需要獲取異步的結(jié)果。
到此這篇關(guān)于Java異步編程之Callbacks與Futures模型詳解的文章就介紹到這了,更多相關(guān)Java Callbacks Futures內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot如何通過controller層實現(xiàn)頁面切換
在Spring Boot中,通過Controller層實現(xiàn)頁面切換背景,Spring Boot的默認(rèn)注解是@RestController,它包含了@Controller和@ResponseBody,@ResponseBody會將返回值轉(zhuǎn)換為字符串返回,因此無法實現(xiàn)頁面切換,將@RestController換成@Controller2024-12-12
詳解Mybatis中javaType和ofType的區(qū)別
本文主要介紹了詳解Mybatis中javaType和ofType的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05
mybatis-plus 新增/修改如何實現(xiàn)自動填充指定字段
這篇文章主要介紹了mybatis-plus 新增/修改實現(xiàn)自動填充指定字段方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06
MyBatis簡介與配置MyBatis+Spring+MySql的方法
MyBatis 是一個可以自定義SQL、存儲過程和高級映射的持久層框架。這篇文章主要介紹了MyBatis簡介與配置MyBatis+Spring+MySql的方法,需要的朋友可以參考下2017-04-04
spring-boot2.7.8添加swagger的案例詳解
這篇文章主要介紹了spring-boot2.7.8添加swagger的案例詳解,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2024-01-01
Java調(diào)用ChatGPT(基于SpringBoot和Vue)實現(xiàn)可連續(xù)對話和流式輸出的ChatGPT API
這篇文章主要介紹了Java調(diào)用ChatGPT(基于SpringBoot和Vue),實現(xiàn)可連續(xù)對話和流式輸出的ChatGPT API(可自定義實現(xiàn)AI助手),文中代碼示例介紹的非常詳細(xì),感興趣的朋友可以參考下2023-04-04

