【jdk】jdk11 jdk17 jdk21的新特性 虚拟线程创建方式

前言:按照博主的个人理解,一般来说 除了jdk8时代 说jdk8的新特性是特指jdk8这一个版本的特性,之后例如jdk11 jdk17新特性 都是泛特性
什么意思呢? 比如jdk11新特性,一般是指jdk9——jdk11 这一个泛版本的所有新特性,就jdk9引入的 List.of Map.of等api 我们也统称是jdk11的新特性

文章目录

  • 为什么大家只提及这几个版本
  • jdk11主要新特性
  • jdk17主要新特性
  • jdk21主要新特性
    • 虚拟线程

为什么大家只提及这几个版本

为什么我们很少听到jdk9,jdk10…等其它版本呢
个人认为被大家广为流传的版本需要同时满足以下两点:

  1. 有重大更新的版本 比如典型的jdk8时代带来的lambda等特性
  2. 是LTS版本 (长期支持版本) 作为企业 肯定也需要考虑这点

jdk11主要新特性

这里说的是泛特性 即jdk9——jdk11
主要例举博主接触到的,应该也是我们比较常见的一些情况

  1. 新增了List.of , Map.of 等api,简化了代码 (jdk9特性)
    (List.of()类似Arrays.asList , 都是不可删除的list)

  2. stream流api更新
    在旧版本的jdk中,stream流有个致命的缺点 不能break! 这使得我们在需要break的时候及其不方便, 有了takeWhile方法 可以一定程度上实现break。

   	    List<Integer> list = Stream.of(4, 2 ,3).takeWhile(i->(i<3)).toList();
        // 输出空list
        System.out.println(list);

        List<Integer> list1 = Stream.of(1, 2 ,3).takeWhile(i->(i<3)).toList();
        // 输出 [1,2]
        System.out.println(list1);

但是注意!它是按顺序来执行的,如果第一个元素都不符合 就直接break了
我们可以举个例子

List<String> nameList = List.of("小帅","孟秋与你","小丑");
// break写法:
for(String name : nameList){
  if("孟秋与你".equals(name)){
  	// 返回一个新的数组
  	return List.of(name);
	break;
   }
}

//  但是如果用takeWhile 将会返回空数组!
// 因为第一个元素"小帅"就不符合我们的判断条件 直接退出了
  1. jdk部分模块被移除 需要单独引入

     例如javaFx被移除 (主要是桌面开发相关的api)
     jaxb涉及的也被移除 (这个主要是xml相关的api)
     rmi 相关的包也被移除 
     (这个日常开发基本用不到 ,对我们来说主要是学习如何防止被rmi远端执行 
     例如著名的log4j事件 黑客就是通过rmi执行的)
     其它模块的移除...
    
  2. 默认垃圾收集器的变化
    说的就是G1 gc收集器

  3. 接口里面支持private方法
    这个可以视为jdk8新增default 方法的一个补充,比如default方法过于庞大,这个时候就可能需要一个private方法抽取逻辑了。

public interface Test{
   
    default void test() {
    	// do other
        testHandle();
    }

    private void testHandle() {
    // do other
    }
}
  1. 语法的简单变化
    这个基本就是泛型加一个类型减一个类型的事了,具体情况不记得了,之前遇过一次,不过影响不大 遇到的话 启动代码的时候如果报错就知道了,非常容易判断并修改的

jdk17主要新特性

同样指的是泛特性 jdk12——jdk17

  1. NPE优化提示
    这个可以说非常友好了, 在链式调用时 会准确提示NPE的位置
    在这里插入图片描述
    旧版jdk (此处指 jdk<= 11) 的提示:
    在这里插入图片描述

  2. 文本块
    这个在编写长文本的时候非常有用
    旧:

   return "<html>\n" +
        " <body>\n" +
        " <p>csdn: 孟秋与你</p>\n" +
        " </body>\n" +
        "</html>";

新:

    return """
        <html>
            <body>
                <p>csdn: 孟秋与你</p>
            </body>
        </html>
        """;
  1. stream流Api进一步更新
    可以直接使用 toList()方法了,不需要使用collect(Collectors.toList())这么麻烦
        List<Integer> list = Stream.of(4, 2 ,3).takeWhile(i->(i<3)).toList();
  1. switch优化
    旧写法 每个分支都要写break 及其臃肿
 public String test() {

        String res = "";
        switch (1){
            case 1:
                res="打工";
                break;
            // ....

            case 6:
                res="休息";
                break;
            default:
                res = "打工";
                break;
        }
        return res;
    }

新写法:
(注意语法 箭头指向的内容即表明了返回值 所以是在return的时候使用该写法)

    public String test() {

       return switch (1) {
            case 1 ->"上班";

            case 6 -> "休息";

           default -> "上班";
       };
      
    }
  1. sealed、permits关键字

    虽然这是jdk17的新特性,但是博主是在jdk21虚拟线程相关的源码中才看到的,这两个关键字主要是用来限制继承关系的,相当于给继承加了个枚举限制,用个例子来解释就特别容易理解


/**
 * sealed + permits 配合使用: 
 * 表示Animal类只可以被 Cat 和 Dog类继承
 * Cat类 和 Dog类需要声明为final (否则可能被多重继承)
 * 若Cat和Dog类没声明为final 或其它类继承了Animal 会报编译时错误
 */
 
public sealed class Animal permits Cat,Dog {
}

public final class Cat extends Animal{
}

public final class Dog extends Animal{
}

// 如果People继承Animal 则People类和Animal类都会直接提示错误
public class People extends Animal{
}

博主是在以下源码看到的这个用法,jdk虚拟线程相关类:BaseVirtualThread (需要jdk21)
在这里插入图片描述

jdk21主要新特性

在这里插入图片描述
上面是官方文档提及的,博主简单概述一下:

虚拟线程

  1. 虚拟线程
    这个是最大的新特性了,将操作系统的线程 提到了jvm层面管理,线程开销极大的缩减了,要说怎么理解这个虚拟线程,博主个人把它当做一个操作系统线程的缓存池来理解,智者见智。

    当然,稍微追踪一下源码很容易发现 它实际原理是通过forkJoinPool来实现的。
    (在jdk8引入的completablefuture 默认也是forkJoinPool来实现的)。

      Runnable runnable = () -> {
            System.out.println("Hello, 孟秋与你");
        };

        // 方式一:使用静态构建器方法 启动,一个快速的虚拟线程
        Thread.startVirtualThread(runnable);

        // 方式二:builder 方式启动
        Thread.Builder.OfVirtual virtual = Thread.ofVirtual();
        // 可以自定义些属性
        virtual.name("virtual thread");
        virtual.start(runnable);

        // 方式三:Executors 也支持了虚拟线程
        ExecutorService executorService = Executors.newVirtualThreadPerTaskExecutor();
        executorService.execute(runnable);

        // 为了确保主线程不会过早退出,等待一段时间
        try {
            Thread.sleep(1111111000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }


虚拟线程有没有必要使用线程池 ?
我们知道阿里规范是不允许通过Executors来创建线程的,虚拟线程它成本低 自动销毁 无需复用,但是线程池也有拒绝策略之类的功能存在,硬要用 好像也不是不行 。
总之显得很矛盾,博主个人观点是不要使用线程池。

如果硬用池化,手动创建方式例子如下:

        ThreadFactory virtualThreadFactory = Thread.ofVirtual().factory();

        ThreadPoolExecutor executor = new ThreadPoolExecutor(
                4,
                4,
                60L,
                TimeUnit.SECONDS,
                // 注: 这个是无界队列
                new LinkedBlockingQueue<>(),
                virtualThreadFactory
        );
        
		  Runnable runnable1 = () -> {
		            System.out.println("Hello, 孟秋与你1111111");
		            try {
		                Thread.sleep(3000L);
		            } catch (InterruptedException e) {
		                throw new RuntimeException(e);
		            }
		        };
		        
	        for (int i = 0; i < 100; i++) {
	            executor.execute(runnable1);
	        }

核心就是线程工厂要设置成虚拟线程工厂,其它参数都是一样的

我们可以看一下源码
在这里插入图片描述

  1. 新的字符串方法
    引入了一些新的字符串方法,进一步增强了字符串操作的能力,如字符串格式化和更高效的字符串比较​

  2. Sequenced Collections
    JDK 21增加了有序集合(Sequenced Collections)的支持,这是一个新的集合类型,元素有固定的遇见顺序,并且提供了一组统一的操作。新的接口包括SequencedCollection、SequencedSet和SequencedMap​ ​。

  3. ZGC垃圾收集器

  4. record 增强
    现在基本都用lomhok了 博主没去看这个

  5. 模式匹配增强(Pattern Matching Enhancements)
    模式匹配得到了进一步增强,特别是在switch语句中的应用。这使得代码更加简洁和表达力更强​ 。

  6. 性能、安全的优化,方法的弃用之类的优化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/753226.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

某山词霸翻译js逆向分析

一、基础知识 1、post的几种发包的方式 2、query string和form data的区别 Query String Parameters&#xff1a; GET请求时&#xff0c;参数会以url string 的形式进行传递&#xff0c;即?后的字符串则为其请求参数&#xff0c;并以&作为分隔符。&#xff08;有时候pos…

稀疏迭代最近点算法(Sparse ICP)

2013年&#xff0c;2013年Sofien Bouaziz等提出了一种新的ICP改进算法&#xff0c;稀疏迭代最近点(Sparse Iterative Closest Point, Sparse ICP)算法。更多扩展资料可参看随书附赠资源中的说明文档。 Sparse ICP算法的设计的灵感、应用范围、优缺点和泛化能力 两个几何数据集…

vue 代理

一、常用的发送一个ajax请求&#xff1a; 1、xhr new XMLHttpRequest(),真正开发中不常用 2、jq&#xff0c;jq主要功能是获取dom&#xff0c;周边才是请求接口 3、axios&#xff08;大名鼎鼎的&#xff09; axios.get("url").then(response>{},error>{} )4、…

大数据组件--Hue

Apache Hue hue是一个集成化的大数据可视化软件&#xff0c;可以通过hue访问浏览操作主流的大数据生态圈软件。hue本身来自于cloudera后来贡献给了apachehue本身是一个web项目&#xff0c;基于python实现的&#xff0c;通过该web项目的UI集成了各个软件的UI 下面是一个hue调度…

远程桌面无法复制粘贴文件到本地怎么办?

远程桌面不能复制粘贴问题 Windows远程桌面为我们提供了随时随地访问文件和数据的便捷途径&#xff0c;大大提升了工作和生活的效率。然而&#xff0c;在使用过程中&#xff0c;我们也可能遇到一些问题。例如&#xff0c;在通过远程桌面传输文件时&#xff0c;常常会出现无法复…

什么软件可以做计划 能做待办计划的app

在快节奏的现代生活中&#xff0c;做计划已成为许多人提高效率、管理时间的重要方法。无论是学生安排学习进度&#xff0c;还是职场人士规划工作任务&#xff0c;一份清晰的计划都能帮助我们更好地掌控生活节奏&#xff0c;实现目标。 选择一款好用的待办软件来做计划&#xf…

报错及解决问题记录

解决&#xff1a; sudo vim /etc/hosts

金融科技如何以细颗粒度服务提升用户体验与满意度

在金融科技迅速发展的当下&#xff0c;各种技术手段被广泛应用于提升用户体验与满意度。这些技术手段不仅提供了更为精准、个性化的服务&#xff0c;还通过优化操作流程、提升服务效率等方式&#xff0c;显著改善了用户的金融生活。以下将详细探讨金融科技如何运用这些技术手段…

图数据库 vs 向量数据库

最近大模型出来之后&#xff0c;向量数据库重新翻红&#xff0c;业界和市场上有不少声音认为向量数据库会极大的影响图数据库&#xff0c;图数据库市场会萎缩甚至消失&#xff0c;今天就从技术原理角度来讨论下图数据库和向量数据库到底差别在哪里&#xff0c;适合什么场景&…

昇思25天学习打卡营第3天|数据集全攻略:加载、操作与自定义

导入数据集相关库和类 首先&#xff0c;导入了 NumPy 库&#xff0c;并将其简称为 np 。要知道&#xff0c;NumPy 乃是用于科学计算的关键库&#xff0c;作用非凡。接着&#xff0c;从 mindspore.dataset 当中导入了 vision 模块。此外&#xff0c;还从 mindspore.dataset 里引…

C++使用Poco库封装一个HTTP客户端类

0x00 前言 我们在使用HTTP协议获取接口数据时&#xff0c;通常需要在Header和Query中添加参数&#xff0c;还有一种就是在Body中追加XML或者JSON格式的数据。本文主要讲述使用Poco库提交HTTP Post请求的Body中附加XML格式的数据&#xff0c;JSON格式的数据类似。 0x01 HttpCl…

禹神electron学习~

最近时间比较富裕 咱们浅浅来学习下electron 视频在这禹神&#xff1a;一小时快速上手Electron&#xff0c;前端Electron开发教程_哔哩哔哩_bilibili 先看下流程模型 先决条件 首先第一步 查看你的node和npm版本 创建你的应用 创建一个文件夹 我创建的名称为my-electron-…

人工智能期末复习思维导图,参考人工智能及其应用(第6版)和柴玉梅老师教材

其中第一、六、七、八、九章不用重点看&#xff0c;计算题一般会考1.语义网络、谓词逻辑&#xff0c;2.可信度&#xff0c;3.主观贝叶斯&#xff0c;4.一般合一置换&#xff0c;5.证据理论&#xff0c;6.盲目搜索。 第一章&#xff1a;绪论 第二章&#xff1a;知识表示方法 第…

MQ - RabbitMQ、SpringAMQP --学习笔记

什么是MQ&#xff1f; MQ 是消息队列&#xff08;Message Queue&#xff09;的缩写&#xff0c;它是一种应用程序间异步通信的技术。消息队列允许应用程序或服务间通过发送消息来交换数据&#xff0c;而不是直接调用对方&#xff0c;从而实现解耦、异步处理和负载均衡等目的。…

无需高配置 怎么获得超流畅的VR体验?

传统VR眼镜在使用中存在一些显著不足&#xff0c;而实时渲染技术又是如何解决的&#xff1f;接下来与大家共同探讨遇到的问题以及实时渲染在VR眼镜中的实际应用。 1、高配置要求 目前主流VR一体机的眼镜需要较高配置才能运行普通VR内容&#xff0c;且受限于VR眼镜的算力限制&…

工作纪实51-手撸AB实验分流策略

前几天写了一篇关于哈希算法的文章&#xff0c;起源就是在构思AB实验平台的时候&#xff0c;用到了哈希&#xff0c;所以对其做了深入的了解 AB实验平台是一般互联网做策略、样式实验会用到的一个系统&#xff0c;一般开启某个实验之后&#xff0c;需要对线上流量进行分流&…

太速科技-FMC144 -八路 250MSPS 14bit AD FMC子卡

FMC144 -八路 250MSPS 14bit AD FMC子卡 一、板卡概述   FMC144是一款具有8通道模数转换器&#xff08;ADC&#xff09;的FMC卡&#xff0c;具有14bit分辨率&#xff0c;最大采样速率达250Msps。时钟配置芯片为AD9516-1&#xff0c;可由板载10MHz时钟提供参考&#xff0c;也可…

[游戏开发][UE5]引擎学习记录

C Log和蓝图Log C Log 方法 UE_Log(参数1&#xff0c;参数2&#xff0c;参数3) //举例: UE_LOG(LogTemp, Error, TEXT("Log Info: %s"),"Test Log"); 三个参数的作用 参数1&#xff1a;输出窗口归类使用&#xff0c;你写什么它就显示什么 参数2&#x…

node.js安装

下载地址 https://nodejs.org/en/download 安装教程

Stable Diffusion初体验——提示词指南

前言 Stable Diffusion是一种深度学习模型&#xff0c;它能够根据提示词生成高质量的图像。在Stable Diffusion模型中&#xff0c;提示词起着至关重要的作用&#xff0c;因为它们为模型提供了关于所需输出的指导。本文将探讨Stable Diffusion关于提示词的原理&#xff0c;包括…