返回顶部
首页 > 资讯 > 精选 >Java多线程开发工具之CompletableFuture怎么应用
  • 890
分享到

Java多线程开发工具之CompletableFuture怎么应用

2023-07-05 13:07:41 890人浏览 薄情痞子
摘要

这篇“Java多线程开发工具之CompletableFuture怎么应用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Jav

这篇“Java多线程开发工具之CompletableFuture怎么应用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java多线程开发工具之CompletableFuture怎么应用”文章吧。

Single Dog拿一个Appointment来举个列子,如下:

    public static void main(String[] args) {        // 线程池我前面的文章聊过,怎么配置可以去了解一下       ThreadPoolExecutor threadPool= new ThreadPoolExecutor(2, 10, 10, TimeUnit.SECONDS,                new LinkedBlockingDeque<>(10), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());        //任务1        CompletableFuture<String> makeUpFuture = CompletableFuture.supplyAsync(() -> {            System.out.println(Thread.currentThread().getName() + "-女神,开始化妆了");            try {                // 化妆的时间                TimeUnit.SECONDS.sleep(5);            } catch (InterruptedException e) {                e.printStackTrace();            }            return "化妆完毕了。";        }, threadPool);       //任务2,makeUp是调用方,意思是makeUpFuture执行完后再执行        CompletableFuture<String> dressFuture = makeUpFuture.thenApply((result) -> {            System.out.println(Thread.currentThread().getName() + "-女神" + result + "我开始选衣服啦,好了叫你!");            try {                // 换衣服的时间                TimeUnit.SECONDS.sleep(5);            } catch (InterruptedException e) {                e.printStackTrace();            }            return result + "衣服也选好了,走出去玩吧!";        });        dressFuture.thenAccept((result) -> {            System.out.println(Thread.currentThread().getName() + "-" + result);        });    }

上面的2个任务也可以理解为我们开发中要实现的不同功能,看明白前面的列子了吧?用它来写多线程运用的多丝滑。那我们就先讲一下它的核心的静态的方法,推荐用它的静态方法不要直接new对象。

无返回值的静态方法:

public static CompletableFuture<Void> runAsync(Runnable runnable)。

public static CompletableFuture<Void> runAsync(Runnable runnable, Executor executor) 。

上面一个2个方法,如果没有指定Executor就使用默认的ForkJoinPool.commonPool()线程池,如果指定线程池就使用指定的。

有返回值的方法

public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier)

 public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier, Executor executor)

如果开始的代码你还看不懂那介绍了上面的几个方法就先小试牛刀一下:

ThreadPoolExecutor threadPool = new ThreadPoolExecutor(2, 10, 10, TimeUnit.SECONDS,                new LinkedBlockingDeque<>(10), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());        CompletableFuture.runAsync(() -> {            System.out.println(Thread.currentThread().getName());            int i = 10 / 2;            System.out.println("运行的结果是:" + i);        }, threadPool);        CompletableFuture future = CompletableFuture.supplyAsync(() -> {                    try {                        Thread.sleep(2);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                    return "Hello World";                }, threadPool);        System.out.println(future.get());

好了讲过它的使用方法了那我们就聊一下它的几个使用的场景,开发中这写场景应该会使用到。

执行任务 A,执行任务B,待任务B执行完成后,用B的返回值区执行任务C。

ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 10, 10, TimeUnit.SECONDS,                new LinkedBlockingDeque<>(10), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());        CompletableFuture<String> futureA = CompletableFuture.supplyAsync(() ->        {            try {                Thread.sleep(2000);            } catch (InterruptedException e) {                e.printStackTrace();            }            System.out.println("执行任务A");            return "任务A";        }, executor);        CompletableFuture<String> futureB = CompletableFuture.supplyAsync(() -> {            System.out.println("执行任务B");            return "任务B";        }, executor);        CompletableFuture<String> futurec = futureB.thenApply((b) -> {            System.out.println("执行任务C");            System.out.println("参数:" + b);            return "a";        });        System.out.println(futurec.get());

运行结果,注意我上面没说B一定要在A执行以后执行。

Java多线程开发工具之CompletableFuture怎么应用

场景2:多个任务串联执行,下一个任务的执行依赖上一个任务的结果,每个任务都有输入和输出。

ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 10, 10, TimeUnit.SECONDS,                new LinkedBlockingDeque<>(10), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());        CompletableFuture futureA = CompletableFuture.supplyAsync(() -> "Hello", executor);        CompletableFuture futureB = futureA.thenApply((a) -> a + " World");        CompletableFuture futureC = futureB.thenApply((b) -> b);        System.out.println(futureC.join());

输出结果,开发中的经典场景输出:

Java多线程开发工具之CompletableFuture怎么应用

场景3:thenCombineAsync 联合 futureA和futureB的返回结果,然后在返回相关的数据

ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 10, 10, TimeUnit.SECONDS,                new LinkedBlockingDeque<>(10), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());        CompletableFuture<Integer> futureA = CompletableFuture.supplyAsync(() -> 10, executor);        CompletableFuture<Integer> futureB = CompletableFuture.supplyAsync(() -> 20, executor);        CompletableFuture futureC = futureA.thenCombineAsync(futureB, (r1, r2) -> {            System.out.println("r1的值为:" + r1 + ":r2的值为:" + r2);            return r1 + r2;        });        System.out.println(futureC.get());

结果输出:

Java多线程开发工具之CompletableFuture怎么应用

 好了聊完几个场景那就写一个在开发中的经典运用。

ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 10, 10, TimeUnit.SECONDS,                new LinkedBlockingDeque<>(10), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());        System.out.println("start...");        CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {            System.out.println("查询商品信息1");            return "future1";        }, executor);        CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {            System.out.println("查询商品信息2");            return "future2";        }, executor);        CompletableFuture<String> future3 = CompletableFuture.supplyAsync(() -> {            System.out.println("查询商品信息3");            return "future3";        }, executor);        final CompletableFuture<Void> voidCompletableFuture = CompletableFuture.allOf(future1, future2, future3);        voidCompletableFuture.get();        System.out.println("end...future1的结果:" + future1.get() + ",future2的结果:" + future2.get() + ",future3的结果:" + future3.get());

输出结果

Java多线程开发工具之CompletableFuture怎么应用

以上就是关于“Java多线程开发工具之CompletableFuture怎么应用”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

--结束END--

本文标题: Java多线程开发工具之CompletableFuture怎么应用

本文链接: https://lsjlt.com/news/352161.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java多线程开发工具之CompletableFuture怎么应用
    这篇“Java多线程开发工具之CompletableFuture怎么应用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Jav...
    99+
    2023-07-05
  • Java多线程开发工具之CompletableFuture的应用详解
    做Java编程,难免会遇到多线程的开发,但是JDK8这个CompletableFuture类很多开发者目前还没听说过,但是这个类实在是太好用了,了解它的一些用法后相信你会对它爱不释手...
    99+
    2023-03-20
    Java CompletableFuture多线程开发 Java CompletableFuture使用 Java CompletableFuture
  • java多线程之并发工具类CountDownLatch,CyclicBarrier和Semaphore
    目录CountDownLatchSemaphoreCyclicBarrier总结 CountDownLatch CountDownLatch允许一个或多个线程等待其他线程完成操作。 ...
    99+
    2024-04-02
  • Java多线程之同步工具类CyclicBarrier
    目录1 CyclicBarrier方法说明2 CyclicBarrier实例3 CyclicBarrier源码解析CyclicBarrier构造函数 await方法 nextGene...
    99+
    2024-04-02
  • Java多线程之同步工具类CountDownLatch
    目录1 CountDownLatch主要方法2 CountDownLatch使用例子3 CountDownLatch源码分析构造函数countDown方法countDown方法的内部...
    99+
    2024-04-02
  • Java多线程之同步工具类Exchanger
    目录1 Exchanger 介绍2 Exchanger 实例exchange等待超时 3 实现原理1 Exchanger 介绍 前面分别介绍了CyclicBarrier、CountD...
    99+
    2024-04-02
  • Java开发工具Maven怎么用
    这篇文章给大家分享的是有关Java开发工具Maven怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Maven如果作为一个Java程序员,那么在日常的开发过程中,maven是很常见的项目构建工具。maven可...
    99+
    2023-06-15
  • Java多线程怎么使用同步工具类CyclicBarrier
    本篇内容介绍了“Java多线程怎么使用同步工具类CyclicBarrier”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1 CyclicBa...
    99+
    2023-06-25
  • Java多线程同步工具类CountDownLatch怎么使用
    本篇内容主要讲解“Java多线程同步工具类CountDownLatch怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java多线程同步工具类CountDownLatch怎么使用”吧!简介...
    99+
    2023-07-02
  • 多线程备份工具mydumper怎么用
    这篇文章主要介绍了多线程备份工具mydumper怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 安装 ...
    99+
    2024-04-02
  • Java多线程Semaphore工具的使用详解
    目录Semaphore 是一种用于控制线程并发访问数的同步工具。它通过维护一定数量的许可证来限制对共享资源的访问。 许可证的数量就是可以同时访问共享资源的线程数目。 当一个线程需要访...
    99+
    2023-05-19
    Java 多线程 Java Semaphore
  • Linux多线程下载工具myget怎么用
    这篇文章主要介绍了Linux多线程下载工具myget怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。安装很方便,wget http://myget.sourceforge...
    99+
    2023-06-13
  • DelayQueue怎么在Java多线程并发开发中使用
    这篇文章给大家介绍DelayQueue怎么在Java多线程并发开发中使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Delayed,一种混合风格的接口,用来标记那些应该在给定延迟时间之后执行的对象。此接口的实现必须定...
    99+
    2023-05-31
    java delayqueue 多线程并发
  • Java多线程之锁怎么使用
    本篇内容介绍了“Java多线程之锁怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!首先强调一点:Java多线程的锁都是基于对象的,Ja...
    99+
    2023-07-05
  • Java线程Dump分析工具jstack怎么用
    这篇文章主要为大家展示了“Java线程Dump分析工具jstack怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java线程Dump分析工具jstack怎么用”这篇文章吧。jstack用于...
    99+
    2023-05-30
  • Java Thread多线程开发中Object类怎么使用
    这篇“Java Thread多线程开发中Object类怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Jav...
    99+
    2023-07-05
  • Java多线程同步工具类CyclicBarrier的使用
    目录CyclicBarrier是什么CyclicBarrier的基本使用方法CyclicBarrier的源码实现(1)CyclicBarrier的初始化(2)CyclicBarrie...
    99+
    2023-05-18
    Java CyclicBarrier
  • java多线程中的并发工具类CountDownLatch,CyclicBarrier和Semaphore该怎么理解
    本篇文章给大家分享的是有关java多线程中的并发工具类CountDownLatch,CyclicBarrier和Semaphore该怎么理解,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起...
    99+
    2023-06-22
  • Arthas在线java进程诊断工具怎么用
    这期内容当中小编将会给大家带来有关Arthas在线java进程诊断工具怎么用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。`Arthas` 是 Alibaba 开源的Java诊断工具,深受开发者喜爱。当你...
    99+
    2023-06-25
  • Java并发编程之工具类Semaphore的使用
    一、Semaphore的理解 Semaphore属于java.util.concurrent包; Semaphore翻译成字面意思为信号量,Semaphore可以控...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作