当前位置:首页 > 科技  > 软件

面试官:如何实现线程池任务编排?

来源: 责编: 时间:2024-09-10 09:45:49 167观看
导读任务编排(Task Orchestration)是指管理和控制多个任务的执行流程,确保它们按照预定的顺序正确执行。1.为什么需要任务编排?在复杂的业务场景中,任务间通常存在依赖关系,也就是某个任务会依赖另一个任务的执行结果,在这种情况

9lY28资讯网——每日最新资讯28at.com

任务编排(Task Orchestration)是指管理和控制多个任务的执行流程,确保它们按照预定的顺序正确执行9lY28资讯网——每日最新资讯28at.com

1.为什么需要任务编排?

在复杂的业务场景中,任务间通常存在依赖关系,也就是某个任务会依赖另一个任务的执行结果,在这种情况下,我们需要通过任务编排,来确保任务按照正确的顺序进行执行。9lY28资讯网——每日最新资讯28at.com

例如,以下任务的执行顺序:9lY28资讯网——每日最新资讯28at.com

9lY28资讯网——每日最新资讯28at.com

其中,任务二要等任务一执行完才能执行,而任务四要等任务二和任务三全部执行完才能执行。9lY28资讯网——每日最新资讯28at.com

2.任务编排实现

任务编排和控制的主要手段有以下:9lY28资讯网——每日最新资讯28at.com

  • Future
  • CompletableFuture
  • CountDownLatch
  • Semaphore
  • CyclicBarrier

但如果是全局线程池,想要实现精准的任务编排,只能使用 Future 或 CompletableFuture。9lY28资讯网——每日最新资讯28at.com

(1)Future 任务编排

使用 Future 实现上述 4 个任务的编排(任务二要等任务一执行完才能执行,而任务四要等任务二和任务三全部执行完才能执行):9lY28资讯网——每日最新资讯28at.com

import java.util.concurrent.*;import java.util.Arrays;public class TaskOrchestrator {    public static void main(String[] args) {        // 创建一个线程池来执行任务        ExecutorService executor = Executors.newFixedThreadPool(5);        // 定义任务一        Future<String> taskOneResult = executor.submit(new Callable<String>() {            @Override            public String call() throws Exception {                Thread.sleep(2000); // 模拟耗时操作                return "Task One Result";            }        });        // 定义任务二,依赖任务一        Future<String> taskTwoResult = executor.submit(new Callable<String>() {            @Override            public String call() throws Exception {                String result = taskOneResult.get(); // 阻塞等待任务一完成                Thread.sleep(1000); // 模拟耗时操作                return "Task Two Result, got: " + result;            }        });        // 定义任务三        Future<String> taskThreeResult = executor.submit(new Callable<String>() {            @Override            public String call() throws Exception {                Thread.sleep(1500); // 模拟耗时操作                return "Task Three Result";            }        });        // 定义任务四,依赖任务二和任务三        Future<String> taskFourResult = executor.submit(new Callable<String>() {            @Override            public String call() throws Exception {                String taskTwoOutput = taskTwoResult.get(); // 阻塞等待任务二完成                String taskThreeOutput = taskThreeResult.get(); // 阻塞等待任务三完成                Thread.sleep(500); // 模拟耗时操作                return "Task Four Result, got: " + taskTwoOutput + " and " + taskThreeOutput;            }        });        // 打印最终结果        try {            System.out.println("Final Result: " + taskFourResult.get());        } catch (InterruptedException | ExecutionException e) {            e.printStackTrace();        }    }}

(2)CompletableFuture 任务编排

CompletableFutrue 提供的方法有很多,但最常用和最实用的核心方法只有以下几个:9lY28资讯网——每日最新资讯28at.com

9lY28资讯网——每日最新资讯28at.com

接下来,使用 CompletableFuture 实现上述 4 个任务的编排(任务二要等任务一执行完才能执行,而任务四要等任务二和任务三全部执行完才能执行):9lY28资讯网——每日最新资讯28at.com

import java.util.concurrent.CompletableFuture;import java.util.concurrent.ExecutionException;public class CompletableFutureExample {    public static void main(String[] args) {        // 任务一:返回 "Task 1 result"        CompletableFuture<String> task1 = CompletableFuture.supplyAsync(() -> {            try {                // 模拟耗时操作                Thread.sleep(1000);            } catch (InterruptedException e) {                Thread.currentThread().interrupt();                throw new RuntimeException(e);            }            return "Task 1 result";        });        // 任务二:依赖任务一,返回 "Task 2 result" + 任务一的结果        CompletableFuture<String> task2 = task1.handle((result1, throwable) -> {            try {                // 模拟耗时操作                Thread.sleep(1000);            } catch (InterruptedException e) {                Thread.currentThread().interrupt();                throw new RuntimeException(e);            }            return "Task 2 result " + result1;        });        // 任务三:和任务一、任务二并行执行,返回 "Task 3 result"        CompletableFuture<String> task3 = CompletableFuture.supplyAsync(() -> {            try {                // 模拟耗时操作                Thread.sleep(800); // 任务三可能比任务二先完成            } catch (InterruptedException e) {                Thread.currentThread().interrupt();                throw new RuntimeException(e);            }            return "Task 3 result";        });        // 任务四:依赖任务二和任务三,等待它们都完成后执行,返回 "Task 4 result" + 任务二和任务三的结果        CompletableFuture<String> task4 = CompletableFuture.allOf(task2, task3).handle((res, throwable) -> {            try {                // 这里不需要显式等待,因为 allOf 已经保证了它们完成                return "Task 4 result with " + task2.get() + " and " + task3.get();            } catch (InterruptedException | ExecutionException e) {                throw new RuntimeException(e);            }        });        // 获取任务四的结果并打印        String finalResult = task4.join();        System.out.println(finalResult);    }}

本文链接:http://www.28at.com/showinfo-26-112712-0.html面试官:如何实现线程池任务编排?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Rust 又发布新的 1.81.0 版本了!速度真快

下一篇: 时间序列结构变化分析:Python实现时间序列变化点检测

标签:
  • 热门焦点
  • 卢伟冰长文解析K60至尊版 对Redmi有着里程碑式的意义

    在今天的Redmi后性能时代战略发布会结束之后,Redmi总经理卢伟冰又带来了一篇长文,详解了为什么 Redmi 要开启后性能时代?为什么选择和 MediaTek、Pixelworks 深度合作?以及后性
  • K8S | Service服务发现

    一、背景在微服务架构中,这里以开发环境「Dev」为基础来描述,在K8S集群中通常会开放:路由网关、注册中心、配置中心等相关服务,可以被集群外部访问;图片对于测试「Tes」环境或者
  • 微软邀请 Microsoft 365 商业用户,测试视频编辑器 Clipchamp

    8 月 1 日消息,微软近日宣布即将面向 Microsoft 365 商业用户,开放 Clipchamp 应用,邀请用户通过该应用来编辑视频。微软于 2021 年收购 Clipchamp,随后开始逐步整合到 Microsof
  • 小红书1周涨粉49W+,我总结了小白可以用的N条涨粉笔记

    作者:黄河懂运营一条性教育视频,被54万人&ldquo;珍藏&rdquo;是什么体验?最近,情感博主@公主是用鲜花做的,火了!仅仅凭借一条视频,光小红书就有超过128万人,为她疯狂点赞!更疯狂的是,这
  • 2023年,我眼中的字节跳动

    此时此刻(2023年7月),字节跳动从未上市,也从未公布过任何官方的上市计划;但是这并不妨碍它成为中国最受关注的互联网公司之一。从2016-17年的抖音强势崛起,到2018年的&ldquo;头腾
  • 一条抖音4亿人围观 ! 这家MCN比无忧传媒还野

    作者:Hiu 来源:互联网品牌官01 擦边少女空降热搜,幕后推手曝光被网友誉为&ldquo;纯欲天花板&rdquo;的女网红井川里予,近期因为一组哥特风照片登上热搜,引发了一场互联网世界关于
  • 小米MIX Fold 3下月亮相:今年唯一无短板的全能折叠屏

    这段时间以来,包括三星、一加、荣耀等等有不少品牌旗下的最新折叠屏旗舰都有新的进展,其中荣耀、三星都已陆续发布了最新的折叠屏旗舰,尤其号荣耀Magi
  • Windows 11发布,微软一改往常对老机型开放的态度

    距离 Windows 11 发布已经过去一周,在过去一周里,很多数码爱好者围绕其对 Android 应用的支持、对老机型的升级问题展开了激烈讨论。与以往不同的是,在这次大
  • 北京:科技教育体验基地开始登记

      北京“科技馆之城”科技教育体验基地登记和认证工作日前启动。首批北京科技教育体验基地拟于2023年全国科普日期间挂牌,后续还将开展常态化登记。  北京科技教育体验基
Top