CompletableFuture

  前面我们使用过jdk5 提出future的用法,但是在获取结果上并不是那么友好

  在Java8中,CompletableFuture提供了非常强大的Future的扩展功能,可以帮助我们简化异步编程的复杂性,并且提供了函数式编程的能力,可以通过回调的方式处理计算结果,也提供了转换和组合 CompletableFuture 的方法。

  没有用过的同学,我们先来一个入门使用了解一下

public class CompletableFutureAction {

    private static final Random RANDOM = new Random(System.currentTimeMillis());

    public static void main(String[] args) {

        //很少有这么使用的.
CompletableFuture<Double> completableFuture = new CompletableFuture<>(); new Thread(()->{
double v = get();
completableFuture.complete(v);
}).start(); System.out.println("程序执行");
//当程序完成时自动回调,不需要阻塞
completableFuture.whenComplete((v,t)->{
Optional.ofNullable(v).ifPresent(System.out::println);
Optional.ofNullable(t).ifPresent(x->{t.printStackTrace();});
});
System.out.println("程序执行后..."); } static double get(){
try {
System.out.println("执行耗时任务");
Thread.sleep(RANDOM.nextInt(10000)); } catch (InterruptedException e) {
e.printStackTrace();
}
return RANDOM.nextDouble();
} }

CompletableFuture.supplyAsync

我们一般不使用new的方式创建completableFuture

在main 方法中我们在使用一个例子来介绍它的使用

因为在mian方法中,主线程可能会提前结束所以我们在做这个例子的时候,需要对线程做一些阻塞

public class CompletableFutureAction1 {
public static void main(String[] args) throws InterruptedException {
    //另一种方式来等到结果输出在结束
ExecutorService executorService = Executors.newFixedThreadPool(2,r -> {
Thread t = new Thread(r);
//设置成守护线程->结果不一定能等到执行结束
t.setDaemon(false);
return t;
});
AtomicBoolean atomicBoolean = new AtomicBoolean(true);
CompletableFuture.supplyAsync(CompletableFutureAction::get,executorService).whenComplete((v,t)->
{
Optional.of(v).ifPresent(System.out::println);
atomicBoolean.set(false);
executorService.shutdown();
Optional.ofNullable(t).ifPresent(x->{t.printStackTrace();});
}); System.out.println("没有进入阻塞");
// Thread.currentThread().join();
/* while (atomicBoolean.get()){ }*/ executorService.execute(()-> System.out.println("2222")); }
} 我们可以使用这样的方式来判断获取到结果
  AtomicBoolean atomicBoolean = new AtomicBoolean(true);
CompletableFuture.supplyAsync(CompletableFutureAction::get).whenComplete((v,t)->
{
Optional.of(v).ifPresent(System.out::println);
atomicBoolean.set(false);
executorService.shutdown();
Optional.ofNullable(t).ifPresent(x->{t.printStackTrace();});
}); System.out.println("没有进入阻塞");
// Thread.currentThread().join();
while (atomicBoolean.get()){ }
 

comletableFuture流水线的工作

 CompletableFuture.supplyAsync(CompletableFutureAction::get,executorService)
.thenApply(CompletableFutureAction2::multiply).whenComplete((v,t)->{
Optional.of(v).ifPresent(System.out::println);
// executorService.shutdown();
Optional.ofNullable(t).ifPresent(x->{t.printStackTrace();} ); });
  public static double multiply(double value){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return value*10d;
}
   static double get(){
try {
System.out.println("=======执行耗时任务");
Thread.sleep(RANDOM.nextInt(10000)); } catch (InterruptedException e) {
e.printStackTrace();
}
double v = RANDOM.nextDouble();
System.out.println(v);
return v;
} 执行的结果:

=======执行耗时任务
没有进入阻塞
0.808110430680034
8.08110430680034

 

多任务调度方式模拟:

        List<Integer> ids = Arrays.asList(1, 2, 3, 4, 5);

        Stream<CompletableFuture<Double>> completableFutureStream = ids.parallelStream().map(i -> CompletableFuture.supplyAsync(() -> queryByid(i), executorService));
  //这边也是并行执行
List<Double> collect = completableFutureStream.map(future -> future.thenApply(CompletableFutureAction2::multiply)).map(CompletableFuture::join).collect(Collectors.toList());
System.out.println(collect);
public static double queryByid(double i){
return CompletableFutureAction.get();
}
 

comletableFuture API

completable 用法的更多相关文章

  1. EditText 基本用法

    title: EditText 基本用法 tags: EditText,编辑框,输入框 --- EditText介绍: EditText 在开发中也是经常用到的控件,也是一个比较必要的组件,可以说它是 ...

  2. jquery插件的用法之cookie 插件

    一.使用cookie 插件 插件官方网站下载地址:http://plugins.jquery.com/cookie/ cookie 插件的用法比较简单,直接粘贴下面代码示例: //生成一个cookie ...

  3. Java中的Socket的用法

                                   Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...

  4. [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法

    一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...

  5. python enumerate 用法

    A new built-in function, enumerate() , will make certain loops a bit clearer. enumerate(thing) , whe ...

  6. [转载]Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结

    本文对Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法进行了详细的总结,需要的朋友可以参考下,希望对大家有所帮助. 详细解读Jquery各Ajax函数: ...

  7. 【JavaScript】innerHTML、innerText和outerHTML的用法区别

    用法: <div id="test">   <span style="color:red">test1</span> tes ...

  8. chattr用法

    [root@localhost tmp]# umask 0022 一.chattr用法 1.创建空文件attrtest,然后删除,提示无法删除,因为有隐藏文件 [root@localhost tmp] ...

  9. 萌新笔记——vim命令“=”、“d”、“y”的用法(结合光标移动命令,一些场合会非常方便)

    vim有许多命令,网上搜有一堆贴子.文章列举出各种功能的命令. 对于"="."d"."y",我在无意中发现了它们所具有的相同的一些用法,先举 ...

随机推荐

  1. cmd中输入net start mysql 提示:服务名无效或者MySQL正在启动 MySQL无法启动

    在DOS窗口.gitbush以及一些可以使用的命令行工具的界面上,输入:net stop mysql.net start mysql时,总是提示:服务名无效. 出现提示如下: 原因是:因为net st ...

  2. 浅论各种调试接口(SWD、JTAG、Jlink、Ulink、STlink)的区别

    JTAG协议 JTAG(Joint Test Action Group,联合测试行动小组)是一种国际标准测试协议(IEEE 1149.1兼容),主要用于芯片内部测试.现在多数的高级器件都支持JTAG协 ...

  3. 利用 vue-cli 构建一个 Vue 项目

    一.项目初始构建 现在如果要构建一个 Vue 的项目,最方便的方式,莫过于使用官方的 vue-cli . 首先,咱们先来全局安装 vue-cli ,打开命令行工具,输入以下命令: $ npm inst ...

  4. LinkedBlockingQueue源码解析

    上一篇博客,我们介绍了ArrayBlockQueue,知道了它是基于数组实现的有界阻塞队列,既然有基于数组实现的,那么一定有基于链表实现的队列了,没错,当然有,这就是我们今天的主角:LinkedBlo ...

  5. Solr 15 - Solr添加和更新索引的过程 (文档的路由细节)

    目录 1 添加文档的细节 1.1 注册观察者 - watcher 1.2 文档的路由 - document route 1.2.1 路由算法 1.2.2 Solr路由的实现类 1.2.3 implic ...

  6. 数据结构之表(C语言实现)

    抽象数据类型 (abstract data type,ADT) 抽象数据类型是一些操作的集合.抽象数据类型是数学中的定义,在ADT中,我们不关心操作是如何被实现的.因此,这可以看做是模块化的扩充.例如 ...

  7. 04-创建kubeconfig认证文件

    本文档记录自己的学习历程! 创建 kubeconfig 文件 kubelet.kube-proxy 等 Node 机器上的进程与 Master 机器的 kube-apiserver 进程通信时需要认证 ...

  8. kubernetes系列11—PV和PVC详解

    本文收录在容器技术学习系列文章总目录 1.认识PV/PVC/StorageClass 1.1 介绍 管理存储是管理计算的一个明显问题.该PersistentVolume子系统为用户和管理员提供了一个A ...

  9. 使用IO流写文件的一些骚操作

    序言 当需要对文件进行操作时,使用IO流是不能避免的操作:比如业务中需要存储一些请求的响应结果中的一些内容.当所需处理的文件过大时,如果频繁的关闭文件流,会造成很大的开销,何时关闭?往往会造成比较大的 ...

  10. 使用原生php爬取图片并保存到本地

    通过一个简单的例子复习一下几个php函数的用法 用到的函数或知识点 curl 发送网络请求 preg_match 正则匹配 代码 $url = 'http://desk.zol.com.cn/bizh ...