下面是一个示例,创建 10 万个线程 , 然后都休眠 1 秒钟最后打印耗时,如果是开传统的 Thread 线程的方式,资源十分紧张;如果是线程池的方式,必定有部分线程在等待线程释放;但是使用虚拟线程的方式,可以瞬间完成 。
import java.util.concurrent.Executors;import java.util.stream.IntStream;public class ThreadTest {public static void main(String[] args) {long start = System.currentTimeMillis();try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {IntStream.range(0, 100_000).forEach(i -> {executor.submit(() -> {Thread.sleep(1000);return i;});});} // executor.close() 会被自动调用// 提交了 10 万个虚拟线程,每个线程休眠 1 秒钟,1秒左右完成System.out.println("耗时:" + (System.currentTimeMillis() - start)+"ms");}}
执行后发现 1.3 秒执行完毕 , 速度惊人 。?bin ./java --enable-preview --source 19ThreadTest.java注: ThreadTest.java 使用 Java SE 19 的预览功能 。注: 有关详细信息 , 请使用 -Xlint:preview 重新编译 。耗时:1309ms?bin
注意:虚拟线程只是增加程序的吞吐量,并不能提高程序的处理速度 。JEP 427: switch 模式匹配 (三次预览)Switch 模式匹配在 Java 17 中已经引入,在 Java 18 中二次预览,现在在 Java 19 中进行三次预览 , 功能和在 Java 18 新功能介绍 - Switch 中介绍的一样,改进后的 Switch 模式匹配可以代码更加简洁,逻辑更加清晰 , 下面是一些使用示例对比 。
下面是几个例子:
// JDK 17 以前static String formatter(Object o) {String formatted = "unknown";if (o instanceof Integer i) {formatted = String.format("int %d", i);} else if (o instanceof Long l) {formatted = String.format("long %d", l);} else if (o instanceof Double d) {formatted = String.format("double %f", d);} else if (o instanceof String s) {formatted = String.format("String %s", s);}return formatted;}
而在 Java 17 之后 , 可以通过下面的写法进行改进:// JDK 17 之后static String formatterPatternSwitch(Object o) {return switch (o) {case Integer i -> String.format("int %d", i);case Long l-> String.format("long %d", l);case Double d-> String.format("double %f", d);case String s-> String.format("String %s", s);default-> o.toString();};}
switch 可以和 null
进行结合判断:static void testFooBar(String s) {switch (s) {case null-> System.out.println("Oops");case "Foo", "Bar" -> System.out.println("Great");default-> System.out.println("Ok");}}
case 时可以加入复杂表达式:static void testTriangle(Shape s) {switch (s) {case Triangle t && (t.calculateArea() > 100) ->System.out.println("Large triangle");default ->System.out.println("A shape, possibly a small triangle");}}
case 时可以进行类型判断:sealed interface S permits A, B, C {}final class A implements S {}final class B implements S {}record C(int i) implements S {}// Implicitly finalstatic int testSealedExhaustive(S s) {return switch (s) {case A a -> 1;case B b -> 2;case C c -> 3;};}
扩展:JEP 406:Switch 的类型匹配(预览)JEP 422: Linux/RISC-V PortRISC-V是一个免费和开源的 RISC 指令集架构 (ISA),实际上 RISC-V 是一系列相关的 ISA,现在 Java 19 开始对其进行支持 。
JEP 424: 外部函数 & 内存 API (预览)此功能引入的 API 允许 Java 开发者与 JVM 之外的代码和数据进行交互,通过调用外部函数(JVM之外)和安全的访问外部内存(非 JVM 管理) , 让 Java 程序可以调用本机库并处理本机数据,而不会像 JNI 一样存在很多安全风险 。
这不是一个新功能,自 Java 14 就已经引入,此次对其进行了性能、通用性、安全性、易用性上的优化 。
推荐阅读
- Java线程未捕获异常处理 UncaughtExceptionHandler
- 拯救者Y9000K2021探索版配置升级_拯救者Y9000K2021探索版升级配置介绍
- 死磕面试系列,Java到底是值传递还是引用传递?
- 【Java复健指南09】项目练习全解--房屋出租系统
- Java集合精选常见面试题
- Java单例模式,看这一篇就够了
- ios15最新消息_airpods新功能怎么用
- 微信支付v3接口的 官方 Java SDK
- 华为p50pro有什么颜色〖科技未来〗-华为p50pro配色介绍
- vivox60手机参数配置_vivox60手机参数配置介绍