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模型的更多相关文章

  1. 异步编程之Generator(1)——领略魅力

    异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2):探究原理 异步编程之Promise(3):拓展进阶 异步编程之Generator(1)--领略魅 ...

  2. 异步编程之Promise(3):拓展进阶

    异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2):探究原理 异步编程之Promise(3):拓展进阶 异步编程之Generator(1)--领略魅 ...

  3. 异步编程之Promise(2):探究原理

    异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2):探究原理 异步编程之Promise(3):拓展进阶 异步编程之Generator(1)--领略魅 ...

  4. (翻译)异步编程之Promise(1):初见魅力

    原文:https://www.promisejs.org/ by Forbes Lindesay 异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2) ...

  5. Java并发编程之CAS

    CAS(Compare and swap)比较和替换是设计并发算法时用到的一种技术.简单来说,比较和替换是使用一个期望值和一个变量的当前值进行比较,如果当前变量的值与我们期望的值相等,就使用一个新值替 ...

  6. net异步编程之await

    net异步编程之await 初探asp.net异步编程之await   终于毕业了,也顺利进入一家期望的旅游互联网公司.27号入职.放肆了一个多月没写代码,好方啊. 另外一下观点均主要针对于await ...

  7. Javascript异步编程之setTimeout与setInterval详解分析(一)

    Javascript异步编程之setTimeout与setInterval 在谈到异步编程时,本人最主要会从以下三个方面来总结异步编程(注意:特别解释:是总结,本人也是菜鸟,所以总结不好的,请各位大牛 ...

  8. 异步编程之co——源码分析

    异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2):探究原理 异步编程之Promise(3):拓展进阶 异步编程之Generator(1)--领略魅 ...

  9. 异步编程之Generator(2)——剖析特性

    异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2):探究原理 异步编程之Promise(3):拓展进阶 异步编程之Generator(1)--领略魅 ...

  10. 【转】Javascript异步编程之setTimeout与setInterval

    Javascript异步编程之setTimeout与setInterval 转自:http://www.tuicool.com/articles/Ebueua 在谈到异步编程时,本人最主要会从以下三个 ...

随机推荐

  1. openSUSE 播放使用VLC播放视频

    openSUSE 使用VLC播放视频 linux视频播放 为什么 通常我们在安装号vlc后,由于版权的原因,是无法获取视频的解码器的.我们需要下载第三方的解码器帮助我们进行解码. 过程如下: 添加pa ...

  2. 自动化测试工具selenium的常用定位方法

    定位方法不仅限于这些,我也会随时补充,大家有其他补充或建议可以在评论区一起讨论哦!!!     [打开链接]drive.get("https://www.baidu.com")   ...

  3. 【编程】Python3 使用自定义编码字符表解密Base64数据

    前言 Python提供了"base64"模块用于编码.解码Base64数据.但是并不是所有的Base64数据都会使用默认的字符表进行编码,所以这里对Python下实现自定义编码字符 ...

  4. Jmeter九、jmeter中的函数和beanshell

    beanshell  松散类型的脚本语言 可在里面自定义函数

  5. 未知:长度为 K 的重复字符子串

    给你一个由小写字母组成的长度为n的字符串 S ,找出所有长度为 k 且包含重复字符的子串,请你返回全部满足要求的子串的数目.   数据范围:  , 进阶: 时间复杂度,空间复杂度 输入例子1: &qu ...

  6. IDEA中maven项目右侧maven图标不见了

    右侧maven图标没有了 解决方法:双击shift(或者点击help-->Find Action) 打开搜索功能 ---> 搜素Maven Project--->选择Add Mave ...

  7. 浅谈oracle连接远程数据库

    若是本地安装了oracle服务器 1 比较直接的方式是直接修改配置文件 去...\product\11.2.0\dbhome_1\NETWORK\ADMIN下面找三个.ora的配置文件:sqlnet. ...

  8. C# 类库 dll 读取配置文件信息

    一:给 C# 类库 dll 添加配置文件并读取配置信息 效果: 1.给类库程序添加配置文件,并命名为:类库名.DLL.config 如上面效果图,类库为:API.dll ,那么其对应的类库配置文件为: ...

  9. Glass Beads

    UVA719 将循环串SSS展开成两倍大小:S+SS+SS+S,这样线性处理就可以处理所有循环的情况了.对S+SS+SS+S建立一个后缀自动机,让后从初始状态开始走,每次选择字典序最小的道路,走NNN ...

  10. 问题积累 - IAR - ErrorTa97:Cannot callintrinsic functionnounwwind _DSBfrom Thumb mode in this architecture

    IAR编译工程时报错: ErrorTa97:Cannot callintrinsic functionnounwwind _DSBfrom Thumb mode in this architectur ...