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. 第二课 如何安装java

    1.三大版本 JDK: Java Development Kit JRE: Java Runtime Environment JVM: JAVA Virtual Machine 2.java开发环境搭 ...

  2. 08 学生课程分数的Spark SQL分析

    读学生课程分数文件chapter4-data01.txt,创建DataFrame. 用DataFrame的操作或SQL语句完成以下数据分析要求,并和用RDD操作的实现进行对比: 每个分数+5分. 总共 ...

  3. Error running 'tm8': Cannot load C:\Users\Administrator\.IntelliJIdea2019.3\system\tomcat\Unnamed_jymes_3\conf\server.xml (系统找不到指定的文件。)

    救命救命,由于脑壳被门夹了去更改了idea的配置,导致重启项目报错!又是给自己挖坑的一天,唉!!! 主要是看报错信息还一直以为是tomcat的问题,然后试了很多方法,比如查看配置的tomcat路径.重 ...

  4. 1903021126-申文骏-Java第十一周作业-Java中继承、多态及抽象类的使用

    项目 内容 课程班级博客链接 19级信计班(本) 作业要求链接 第十一周作业 博客名称 1903021126-申文骏-Java第十一周作业-Java中继承.多态及抽象类的使用 作业要求 每道题要有题目 ...

  5. mysqld 打开连接卡

    把client的ip写在mysql服务器的/etc/hosts文件里 echo [ip] [hostname] >>/etc/hosts

  6. 用bcftools将多个vcf文件合并成一个vcf文件 或将多个vcf和合并成的vcf文件拆分成单个样本的vcf文件

    1. 软件的安装 a. bcftools 的安装 b. bgzip的安装: https://blog.csdn.net/weixin_30471065/article/details/95108525 ...

  7. P1296 奶牛的耳语

    P1296 奶牛的耳语 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 本题核心思路: 1.读入后要排序以达到剪枝的目的 2.模拟,遇到不能再交流就转入下一头牛,否则计数器加一 3. ...

  8. PostgreSQL备份与恢复命令

    postgresql备份与恢复相关命令 --备份用户的数据库bct的所有内容pg_dump -U 用户名 -d 库名 -f xxxXXXxxx.sql--删除原有数据库dropdb -U 用户名 -f ...

  9. Glass Beads

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

  10. vite+vue3使用unplugin-auto-import 无需手动引入api!

    近期了解到unplugin-auto-import这个插件 用途是无需每个组件内重复的引入vue vue-router等内置方法 下面举个例子 <script setup> import ...