jdk21结构化并发

前言

jdk21在2023年9月份就已经发布了,是一个长期支持(LTS)版本,提供五年的Premier支持和扩展支持到2031年9月,而且其发布的新属性,确实值得一看,一下就说一下jdk21的结构化并发

结构化并发

jdk21发布的同时。支持了结构化并发,也就是看见和CompletableFuture一样,提供异步属性,也就是提供了StructuredTaskScope

StructuredTaskScope说明

StructuredTaskScope支持任务拆分为多个并发子任务,在各自的线程中执行,以及子任务必须在主任务继续之前完成的情况

StructuredTaskScope使用

StructuredTaskScope子任务创建

ini 复制代码
public class StructuredDemo {

    public static void main(String[] args) {
        var structuredTaskScope = new StructuredTaskScope<>();
        try (structuredTaskScope) {
            StructuredTaskScope.Subtask<Integer> subtask = structuredTaskScope.fork(() -> {
                System.out.println(14);
                Thread.sleep(5000);
                System.out.println("======1执行完成");
                return 12;
            });
            Supplier<String> stringSupplier = structuredTaskScope.fork(() -> {
                System.out.println(15);
                return "aa";
            });
            structuredTaskScope.join();
            Integer result = subtask.get();
            System.out.println("结果为:" + result);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(10);
    }
}

以上会等待每个子任务完成,然后往下执行,需要使用join()等待,可以单独获取每个子任务的返回结果

ShutdownOnSuccess使用

ShutdownOnSuccess是StructuredTaskScope提供的final修饰的静态类,其作用是,当一个子任务完成时,那么就算其他任务完成了

csharp 复制代码
public class Structured1Demo {

    public static void main(String[] args) {
        var structuredTaskScope = new StructuredTaskScope.ShutdownOnSuccess<>();
        try (structuredTaskScope) {
            StructuredTaskScope.Subtask<Integer> subtask = structuredTaskScope.fork(() -> {
                System.out.println(14);
                Thread.sleep(5000);
                System.out.println("======1执行完成");
                return 12;
            });
            Supplier<String> stringSupplier = structuredTaskScope.fork(() -> {
                System.out.println(15);
                return "aa";
            });
            structuredTaskScope.join();
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(10);
    }
}

这时结果为"======1执行完成"是不会输出的,也是可以获取子任务的返回结果

ini 复制代码
public class Structured1Demo {

    public static void main(String[] args) {
        var structuredTaskScope = new StructuredTaskScope.ShutdownOnSuccess<>();
        try (structuredTaskScope) {
            StructuredTaskScope.Subtask<Integer> subtask = structuredTaskScope.fork(() -> {
                System.out.println(14);
                Thread.sleep(5000);
                System.out.println("======1执行完成");
                return 12;
            });
            Supplier<String> stringSupplier = structuredTaskScope.fork(() -> {
                System.out.println(15);
                return "aa";
            });
            structuredTaskScope.join();
            String data = stringSupplier.get();
            System.out.println(data);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(10);
    }
}

但是需要注意的是,ShutdownOnSuccess是当一个子任务完成时,整个任务就完成了,所以如果获取的子任务没有执行完成,就会抛异常

ShutdownOnFailure使用

ShutdownOnFailure是StructuredTaskScope提供的final修饰的静态类,其作用是,当一个子任务失败时,那么就算其他任务完成了

ini 复制代码
public class Structured1Demo {

    public static void main(String[] args) {
        var structuredTaskScope = new StructuredTaskScope.ShutdownOnFailure();
        try (structuredTaskScope) {
            StructuredTaskScope.Subtask<Integer> subtask = structuredTaskScope.fork(() -> {
                System.out.println(14);
                Thread.sleep(5000);
                System.out.println("======1执行完成");
                return 12;
            });
            Supplier<String> stringSupplier = structuredTaskScope.fork(() -> {
                System.out.println(15);
                int a = 1 / 0;
                return "aa";
            });
            structuredTaskScope.join();
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(10);
    }
}

获取子任务的结果也是一样的,但是这样写是获取不了异常抛出的,要获取子任务异常信息,可以这么写

ini 复制代码
public class Structured1Demo {

    public static void main(String[] args) {
        var structuredTaskScope = new StructuredTaskScope.ShutdownOnFailure();
        try (structuredTaskScope) {
            StructuredTaskScope.Subtask<Integer> subtask = structuredTaskScope.fork(() -> {
                System.out.println(14);
                Thread.sleep(5000);
                System.out.println("======1执行完成");
                return 12;
            });
            Supplier<String> stringSupplier = structuredTaskScope.fork(() -> {
                System.out.println(15);
                int a = 1 / 0;
                return "aa";
            });
            structuredTaskScope.join().throwIfFailed();
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(10);
    }
}

或者这么写

java 复制代码
package cn.com.ut.october.pool;

import java.util.concurrent.StructuredTaskScope;
import java.util.function.Supplier;


/**
 * @author kaolvkaolv
 * @date 2023/10/15 13:13
 * @description 结构化并发
 */
public class Structured1Demo {

    public static void main(String[] args) {
        var structuredTaskScope = new StructuredTaskScope.ShutdownOnFailure();
        try (structuredTaskScope) {
            StructuredTaskScope.Subtask<Integer> subtask = structuredTaskScope.fork(() -> {
                System.out.println(14);
                Thread.sleep(5000);
                System.out.println("======1执行完成");
                return 12;
            });
            Supplier<String> stringSupplier = structuredTaskScope.fork(() -> {
                System.out.println(15);
                int a = 1 / 0;
                return "aa";
            });
            structuredTaskScope.join().throwIfFailed(e->{
                System.out.println(e.getMessage());
                return new RuntimeException("失败");
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(10);
    }
}

可以返回自定义异常信息

总结

以前在使用异步的时候,我们要控制子任务的完成信息时,是很难做到的,jdk21提供了结构化并发,可以帮我们提高开发效率,但是在开发过程是,并不一定要使用这种才能实现,毕竟技术这玩意,实现方式有很多种

相关推荐
回家路上绕了弯4 分钟前
Resilience4j全面指南:轻量级熔断限流框架的实战与落地
分布式·后端
SimonKing5 分钟前
你的网站SSL证书又要过期了?这个工具能让你永久告别焦虑
java·后端·程序员
CryptoRzz6 分钟前
印度交易所 BSE 与 NSE 实时数据 API 接入指南
java·c语言·python·区块链·php·maven·symfony
梵得儿SHI9 分钟前
SpringCloud 核心组件精讲:Sentinel 熔断限流全攻略-流量控制、熔断降级、热点参数限流(含 Dashboard 部署 + 项目集成实操)
java·spring cloud·sentinel·熔断降级·热点参数限流·微服务流量控制
麦兜*9 分钟前
Spring Boot 3.x 升级踩坑大全:Jakarta EE 9+、GraalVM Native 与配置迁移实战
java·spring boot·后端·spring·spring cloud
Moment10 分钟前
一杯茶时间带你基于 Yjs 和 reactflow 构建协同流程图编辑器 😍😍😍
前端·后端·面试
看见繁华11 分钟前
GO 教程
开发语言·后端·golang
Yy_Yyyyy_zz14 分钟前
深入理解 Go 的多返回值:语法、编译原理与工程实践
开发语言·后端·golang
独断万古他化15 分钟前
【SpringBoot 配置文件】properties 与 yml 的基础用法、格式及优缺点
java·spring boot·后端
玄〤16 分钟前
Spring MVC 讲解:从初始化流程到请求参数与 JSON 处理全解析(黑马课程ssm笔记总结)(day5)
java·spring·json·mvc