ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java 19 新功能介绍

2022-11-05 13:41:24  阅读:286  来源: 互联网

标签:java 函数 学习 系统 语言 平台 方法 安装 


Java 19 带来的 7 个新特性:

JEP 描述
405 Record 模式匹配 (Preview)
425 虚拟线程 (预览)
427 Switch 模式匹配 (三次预览)
422 Linux/RISC-V Port
426 Vector API (四次孵化)
424 外部函数 & 内存 API (Preview)
428 Structured Concurrency (Incubator)

Java 19 新功能介绍是 Java 新特性系列文章中的一部分。

系列详情可以浏览:https://www.wdbyte.com/java-feature/

JEP 405: Record 模式匹配(预览)

record 是一种全新的类型,它本质上是一个 final 类,同时所有的属性都是 final 修饰,它会自动编译出 public get hashcode 、equalstoString 等方法,减少了代码编写量。Record 在 Java 14 中被提出,在 Java 15 中二次预览,在 Java 16 中正式发布。

示例:编写一个 Dog record 类,定义 name 和 age 属性。

package com.wdbyte;

public record Dog(String name, Integer age) {
}

Record 的使用。

package com.wdbyte;

public class Java14Record {

    public static void main(String[] args) {
        Dog dog1 = new Dog("牧羊犬", 1);
        Dog dog2 = new Dog("田园犬", 2);
        Dog dog3 = new Dog("哈士奇", 3);
        System.out.println(dog1);
        System.out.println(dog2);
        System.out.println(dog3);
    }
}

输出结果:

Dog[name=牧羊犬, age=1]
Dog[name=田园犬, age=2]
Dog[name=哈士奇, age=3]

在 Java 19 中,为 Record 带来了增强的模式匹配,在使用 instanceof 后,可以进行类型转换。

public class RecordTest {
    public static void main(String[] args) {
        Object dog1 = new Dog("牧羊犬", 1);
        if(dog1 instanceof Dog dogTemp){
            System.out.println(dogTemp.name());
         }
    }
}
record Dog( String name, Integer age ){
}

// ➜  bin ./java  RecordTest.java
// 牧羊犬

甚至可以在使用 instanceof 时直接得到 Record 中的变量引用。

public class RecordTest2 {

    public static void main(String[] args) {
        Object dog1 = new Dog("牧羊犬", 1);
        if(dog1 instanceof Dog(String name,Integer age)){
            System.out.println(name+":"+age);

         }
    }
}

record Dog( String name, Integer age ){
}
//➜  bin ./java --enable-preview --source 19 RecordTest2.java
//注: RecordTest2.java 使用 Java SE 19 的预览功能。
//注: 有关详细信息,请使用 -Xlint:preview 重新编译。
//牧羊犬:1

扩展:

Java 14 instanceof 类型推断

Java 16 Record 介绍

JEP 425: 虚拟线程 (预览)

很实用的一个新特性,从 Java 19 开始逐步的引入虚拟线程,虚拟线程是轻量级的线程,可以在显著的减少代码的编写,提高可维护性的同时提高系统的吞吐量

引入的原因

一直以来,在 Java 并发编程中,Thread 都是十分重要的一部分,Thread 是 Java 中的并发单元,每个 Thread 线程都提供了一个堆栈来存储局部变量和方法调用,以及线程上下文等相关信息。

但问题是线程和进程一样,都是一项昂贵的资源,JDK 将 Thread 线程实现为操作系统线程的包装器,也就是说成本很高,而且数量有限。也因此我们会使用线程池来管理线程,同时限制线程的数量。比如常用的 Tomcat 会为每次请求单独使用一个线程进行请求处理,同时限制处理请求的线程数量以防止线程过多而崩溃;这很有可能在 CPU 或网络连接没有耗尽之前,线程数量已经耗尽,从而限制了 web 服务的吞吐量。

看到这里你可能要说了,可以放弃请求和线程一一对应的方式啊,使用异步编程来解决这个问题,把请求处理分段,在组合成顺序管道,通过一套 API 进行管理,这样就可以使用有限的线程来处理超过线程数量的请求。这当然也是可以的,但是随之而来的问题是:

  • 需要额外的学习异步编程。
  • 代码复杂度增加,等于放弃了语言的基本顺序组合运算。
  • 堆栈上下文信息都变得难以追踪。
  • Debug 困难。
  • 和 Java 平台本身的编程风格有冲突,Java 并发单元是 Thread,而这时是异步管道。

虚拟线程

基于上面的种种原因,Java 19 引入了虚拟线程,在使用体验上和 Thread 没有区别,与之前的 API 互相兼容,但是相比之下虚拟线程资源占用非常少,同时优化了硬件的使用效率,因此非常易用且不需要被池化

下面是一个示例,创建 10 万个线程,然后都休眠 1 秒钟最后打印耗时,如果是开传统的 Thread 线程的方式,资源十分紧张;如果是线程池的方式,必定有部分线程在等待线程释放;但是使用虚拟线程的方式,可以瞬间完成。

标签:java,函数,学习,系统,语言,平台,方法,安装,
来源:

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有