Java 19 新功能介绍( 二 )

  • Debug 困难 。
  • 和 Java 平台本身的编程风格有冲突,Java 并发单元是 Thread , 而这时是异步管道 。
  • 虚拟线程基于上面的种种原因,Java 19 引入了虚拟线程,在使用体验上和 Thread 没有区别,与之前的 API 互相兼容 , 但是相比之下虚拟线程资源占用非常少,同时优化了硬件的使用效率,因此非常易用且不需要被池化 。
    下面是一个示例,创建 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 就已经引入,此次对其进行了性能、通用性、安全性、易用性上的优化 。

    推荐阅读