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. 通过ref调取子组件方法

    子 async update(res){ //this.$refs.child.animates(); this.userform = res; }, 主 <DetailEdit @detail ...

  2. 关于集合set、数据类型转换等

  3. centos8 安装 spdk

    1. 下载 2.配置 ./configure --enable-debug --disable-tests --without-isal --without-ocf  --with-uring --w ...

  4. PHP Redis - 事务

    Redis 事务可以一次执行多个命令, 并有两个重要的保证: ① 事务是一个单独的隔离操作:事务中的所有命令都会序列化.按顺序地执行.事务在执行的过程中,不会被其他客户端发送来的命令请求所打断. ② ...

  5. 排查占用cpu最高线程

  6. 文献阅读笔记——Boosting the Performance of CDCL-Based SAT Solvers by Exploiting Backbones and Backdoors

    Boosting the Performance of CDCL-Based SAT Solvers by Exploiting Backbones and Backdoors 布尔结构措施 本研究考 ...

  7. 后台调用 WEBAPI 几种方式

    示例是调用谷歌短网址的API. 1. HttpClient方式: public static async void DoAsyncPost() { DateTime dateBegin = DateT ...

  8. animation 和 transition 的区别

    Transition 提供了从一种状态过渡到另一种状态的改变. Animation 则可以从不同关键帧(@keyframes)上设置多个过渡点. Transition 关注的是元素指定css属性的变化 ...

  9. store数据仓库

    项目搭建 npm init vite-app GxShujukucd GxShujukunpm inpm i vue-router npm i vuex // 这一句是这节课的关键 新建store ① ...

  10. CentOS基本命令手册

    一.磁盘使用情况 两个命令df .du结合比较直观 df -h #查看整台服务器的硬盘使用情况 du -sh * #查看每个文件夹的大小 二.tar 用法 压缩 tar tar -czvf test. ...