JAVA异步编程之Callbacks与Futures模型
JAVA异步编程之Callbacks与Futures模型
一:Callbacks模型
该模型的异步方法,在异步任务完成之后调用,主线程没有异步线程的结果。经典模型如Swing’s EventListener模型(如果不了解可参考html如何实现button的click方法)
1.1:示例
public class CallbackModel implements Callback, Runnable {
@Override
public void invoke() {
System.out.println("这是异步回调的结果");
}
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName() + "::异步线程任务开始");
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() + "::异步线程任务结束");
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() + "::主线程结束");
}
}
interface Callback {
void invoke();
}
1.2: 运行结果
main::主线程开始
main::主线程结束
线程一::异步线程任务开始
线程一::异步线程任务结束
这是异步回调的结果
二:Futures模型
该模型的异步方法,立刻返回一个包装了结果的返回值Future,T即是包装的返回值,但返回值不可立即访问(异步方法为完成),Future对象包装了对它的访问。可以轮询对象,直到该值可用为止。
2.1 用例
public class FutureModel {
static class FutureTask implements Callable {
@Override
public Object call() {
try {
System.out.println(Thread.currentThread().getName() + "::异步线程任务开始");
Thread.sleep(4000);
System.out.println(Thread.currentThread().getName() + "::异步线程任务结束");
} 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() + "返回的结果::" + submit.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}finally {
pool.shutdown();
}
}
}
2.1 用例结果:
pool-1-thread-1::异步线程任务开始
pool-1-thread-1::异步线程任务结束
main返回的结果::1234
三:Future接口
/**
*异步计算的结果
*/
public interface Future<V> {
/**
* 尝试取消任务,有可能失败
*/
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();
/**
* 等待直至获取结果
*/
V get() throws InterruptedException, ExecutionException;
/**
* 等待指定的时间获取结果,否则抛出异常
*/
V get(long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException;
}
四:小结
1.两种模型还是基于java的Runnable接口和Callable接口
2.Runnable接口配合Thread创建线程,通常不关注返回结果。
3.Callable接口配合Executors(java提供的线程池管理工具)与Future(封装返回结果),常用场景是主线程需要获取异步的结果。
原创连接: http://121.5.70.195/articles/151
参考文献1: https://projectreactor.io/docs/core/release/reference/index.html#_asynchronicity_to_the_rescue
参考文献2: Future源码注释
JAVA异步编程之Callbacks与Futures模型的更多相关文章
- 异步编程之Generator(1)——领略魅力
异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2):探究原理 异步编程之Promise(3):拓展进阶 异步编程之Generator(1)--领略魅 ...
- 异步编程之Promise(3):拓展进阶
异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2):探究原理 异步编程之Promise(3):拓展进阶 异步编程之Generator(1)--领略魅 ...
- 异步编程之Promise(2):探究原理
异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2):探究原理 异步编程之Promise(3):拓展进阶 异步编程之Generator(1)--领略魅 ...
- (翻译)异步编程之Promise(1):初见魅力
原文:https://www.promisejs.org/ by Forbes Lindesay 异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2) ...
- Java并发编程之CAS
CAS(Compare and swap)比较和替换是设计并发算法时用到的一种技术.简单来说,比较和替换是使用一个期望值和一个变量的当前值进行比较,如果当前变量的值与我们期望的值相等,就使用一个新值替 ...
- net异步编程之await
net异步编程之await 初探asp.net异步编程之await 终于毕业了,也顺利进入一家期望的旅游互联网公司.27号入职.放肆了一个多月没写代码,好方啊. 另外一下观点均主要针对于await ...
- Javascript异步编程之setTimeout与setInterval详解分析(一)
Javascript异步编程之setTimeout与setInterval 在谈到异步编程时,本人最主要会从以下三个方面来总结异步编程(注意:特别解释:是总结,本人也是菜鸟,所以总结不好的,请各位大牛 ...
- 异步编程之co——源码分析
异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2):探究原理 异步编程之Promise(3):拓展进阶 异步编程之Generator(1)--领略魅 ...
- 异步编程之Generator(2)——剖析特性
异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2):探究原理 异步编程之Promise(3):拓展进阶 异步编程之Generator(1)--领略魅 ...
- 【转】Javascript异步编程之setTimeout与setInterval
Javascript异步编程之setTimeout与setInterval 转自:http://www.tuicool.com/articles/Ebueua 在谈到异步编程时,本人最主要会从以下三个 ...
随机推荐
- 20192305 王梓全Python程序设计实验一报告
20192305 王梓全Python程序设计实验一报告 课程:<Python程序设计> 班级: 1923 姓名: 王梓全 学号:20192305 实验教师:王志强 实验日期:2021年4月 ...
- 入库大文件csv文件
LOAD DATA LOCAL INFILE 'D:\\ss\\chongzhi\\T_RORD.csv' INTO TABLE cz_T_RECHARGE_SET_RECORDFIELDS TERM ...
- 项目实训 DAY 9
加入页面之间定向的按钮,并改了一个typo
- 理解Node.js中的流(译)
前言 本文部分译自by: Liz Parody in Node.js, 2019.11.23,英文良好的同学建议阅读原版. Node.js中的流是众所周知的难理解,而且更加难用.按照Dominic T ...
- Jmeter九、jmeter中的函数和beanshell
beanshell 松散类型的脚本语言 可在里面自定义函数
- C 语言 scanf 格式化输入函数
C 语言 scanf 格式化输入函数 函数概要 scanf 函数从标准输入流中读取格式化字符串.与 printf 格式化输出函数相反,scanf 函数是格式化输入函数. 函数原型 #include & ...
- 关闭Google自动更新
一.禁用任务计划 二.禁用更新服务 三.重命名更新程序 首先找到谷歌浏览器的安装位置
- CSS 常用样式-文字三属性
颜色 color: 作用:给文字设置颜色. 属性名 k :color 属性值 v :颜色名.颜色值. 颜色名: 颜色名就是使用颜色的英文单词进行表示. 需要记忆一些最常用的颜色名: 更多的颜色名可以通 ...
- CF1272 C Yet Another Broken Keyboard 题解+代码比对
C. Yet Another Broken Keyboard time limit per test 2 seconds memory limit per test 256 megabytes inp ...
- flink常用命令
1.查看flink任务 /var/lib/hadoop-hdfs/flink/bin/flink list 2.停止flink任务 /var/lib/hadoop-hdfs/flink/bin/fl ...