首页 > 其他分享 >异步任务组合神器CompletableFuture

异步任务组合神器CompletableFuture

时间:2024-09-04 16:51:55浏览次数:14  
标签:异步 seconds completed System 神器 耗时 任务 CompletableFuture

使用Demo

import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;

public class CompletableFutureDemo {

    private static AtomicInteger count = new AtomicInteger(2);

    public static void main(String[] args) throws InterruptedException, ExecutionException {

        // 准备10个线程
        ExecutorService executorService = Executors.newFixedThreadPool(2);

        long start = System.currentTimeMillis();

        // 模拟处理订单
        CompletableFuture<Void> dealOrder = CompletableFuture.runAsync(() -> {
            // 模拟任务耗时 0~4秒
            try {
                int seconds = ThreadLocalRandom.current().nextInt(5);
                TimeUnit.SECONDS.sleep(seconds);
                System.out.println("task is completed! cost:" + seconds + "s left: " + count.decrementAndGet());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }, executorService);

        // 模拟处理库存
        CompletableFuture<Void> dealStock = CompletableFuture.runAsync(() -> {
            // 模拟任务耗时 0~4秒
            try {
                int seconds = ThreadLocalRandom.current().nextInt(5);
                TimeUnit.SECONDS.sleep(seconds);
                System.out.println("task is completed! cost:" + seconds + "s left: " + count.decrementAndGet());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }, executorService);

        // 可变参数,可以传任意个CompletableFuture,阻塞等待所有任务完成
        CompletableFuture.allOf(dealOrder, dealStock).get();

        // 最终全部任务完成,总耗时取决于最耗时的任务时长
        System.out.println("all task is completed! cost: " + (System.currentTimeMillis() - start) + "ms");
    }
}

能做什么

比如你需要做这种,任务B和C都执行完后,再执行任务A的情况,就可以使用
在这里插入图片描述

标签:异步,seconds,completed,System,神器,耗时,任务,CompletableFuture
From: https://blog.csdn.net/ZHUSHANGLIN/article/details/141884090

相关文章

  • 细聊C# AsyncLocal如何在异步间进行数据流转--源码探究
    前言#    在异步编程中,处理异步操作之间的数据流转是一个比较常用的操作。C#异步编程提供了一个强大的工具来解决这个问题,那就是AsyncLocal。它是一个线程本地存储的机制,可以在异步操作之间传递数据。它为我们提供了一种简单而可靠的方式来共享数据,而不必担心线程切换或异步......
  • 多线程、任务、异步的区别
    Task和Thread的区别这是一个高频,深刻的问题,无论去哪都逃不过被询问这个问题。Task是基于Thread的,这是众所周知的。但是Task和Thread的联系如此简单和纯粹确实我没想到的。甚至只需要几十行代码就能呈现其原理。一个简单的模拟实例说明Task及其调度问题,这真是一篇好文章。任务体......
  • java实现的开源mocker造数神器,10分钟可完成千万级别数据的造数-入门篇
    java实现的开源mocker造数神器,10分钟可完成千万级别数据的造数-入门篇如果你还在为数据库表造数烦恼?如果你还在造数上花费一天、一周、甚至更多的时间……也许Mocker(模客)能帮你排忧解难。造数是一件令人头疼、繁琐而又无趣的事情,但有些时候它又是开发过程中不可避免的一个阶段......
  • Python教程(十七):协程、 asyncio与 aiohttp【异步IO】
    文章目录专栏列表1.异步IO的基本概念1.1同步与异步1.2协程1.3asyncio1.4aiohttp2.携程2.1定义协程2.2运行协程3.asyncio3.1事件循环解释3.2获取文件示例3.2并发获取文件示例4.aiohttp:异步HTTP客户端/服务器4.1安装aiohttp4.2异步HTTP请求4.3异......
  • unity的异步操作
    1.C#提供了两个关键字来实现异步async和awaitasync 关键字用于声明一个异步方法。该方法内部可以使用 await 关键字来等待异步操作的完成。当方法被标记为 async 时,它隐式地表示该方法可能会包含一个或多个 await 表达式。重要的是要注意,async 方法通常会返回一个 Task......
  • 你还在为去除图片背景烦恼吗?试试这两款免费神器吧!
    今天想和大家聊聊在生活工作中特别实用的小工具,与“抠图”强相关的两款AI工具!说到这2个工具,真是忍不住要为大家强烈推荐一番!他们俩就是:PixianAI、Removerized先说说背景去除这件事儿无论你是设计师、摄影师,还是日常喜欢在社交媒体上分享美图的小伙伴,背景去除这个需求一......
  • 查看Windows下引起Oracle CPU占用率高的神器-qslice
    前言:qslice是一个win2000的工具包,能分析进程的cpu占用率,我们用于分析oracle的性能 这是绿色的软件无需安装。 我们经常会碰到oracle的CPU占用居高不下,无法快速定位到问题SQL,就需要这个神器:qslice。分析过程:1、进入qslice,打开oracle进程,双击进入 2、最大化弹出的窗口,发......
  • 最新DY评论区采集获客助手,一键导出精准获客必备神器
    工具概述社交媒体视频内容分析工具是一款旨在帮助用户从社交媒体平台(如斗音)高效采集和分析视频评论的软件。该工具通过关键词筛选功能,使用户能够快速定位和分析特定主题或品牌相关的用户反馈和市场趋势。核心功能关键词筛选:用户可以设定特定关键词,工具将自动筛选出包含......
  • Java异步编程:CompletableFuture与Future的对比
    Java异步编程:CompletableFuture与Future的对比大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在Java中,异步编程是一种常见的编程范式,用于提高应用程序的响应性和吞吐量。Java提供了多种异步编程工具,其中Future和CompletableFuture是两个重要的接口。......
  • Vue入门(四)Vue异步操作Axios
    一、Vue异步操作在Vue中发送异步请求,本质上还是AJAX。我们可以使用axios这个插件来简化操作!-使用步骤1.引入axios核心js文件。2.调用axios对象的方法来发起异步请求。3.调用axios对象的方法来处理响应的数据。-axios常用方法get:发起Get方式请求post:发起Po......