了解Java21

目前还没有实操过从java8/java11直接到java17,java21。

先储备下知识点,写一些简单例子,以便后续的实操。

一些新特性(java8之后的)

var变量

和前端js定义变量一样了,var搞定

 public static void main(String[] args) {var str = "xxx";var a = new Object();var num = 123;System.out.println(num);System.out.println(str.getClass().getName());System.out.println(a.getClass().getName());}

当然有限制:局部变量,for循环引用等地方

多行文本字符串

public static void main(String[] args) {String s1 = "第一行\n第二行\n第三行";System.out.println(s1);System.out.println(s1.length());System.out.println("------");String s2 = """第一行第二行第三行""";System.out.println(s2);System.out.println(s2.length());}

效果一样
在这里插入图片描述

简单好用的switch case

public class MainSwitch {public static void main(String[] args) {MainSwitch main = new MainSwitch();System.out.println(main.switchTest("one"));System.out.println(main.switchTest("two"));}public String switchTest(String str) {return switch (str){case "one" -> "1";case "two" -> "2";default -> "0";};}
}

类型推断switch例子

interface Go {
}class Bus implements Go {public void out() {System.out.println("by bus");}
}class Car implements Go {public void drive() {System.out.println("drive car");}
}public class MainStr {public static void main(String[] args) {Go go1 = new Bus();outGo(go1);Go go2 = new Car();outGo(go2);}public static void outGo(Go go) {switch (go) {case Bus bus -> bus.out();case Car car -> car.drive();default -> throw new IllegalStateException("Unexpected value: " + go);}}}

虚拟线程

测试如下 确实是虚拟线程快一些。(例子场景是密集的IO请求)

想象多线程为什么慢? 内核开辟资源,多线程的切换,上下文的切换,线程阻塞等待IO…


import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.stream.IntStream;public class VirtualThread {public static void main(String[] args) throws Exception{testThread();testVirtualThread();}public static void testVirtualThread() throws Exception {HttpClient client = HttpClient.newHttpClient();ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor(); // 每个任务使用虚拟线程long startTime = System.currentTimeMillis();IntStream.range(0, 100).forEach(i -> {executor.submit(() -> {try {HttpRequest request = HttpRequest.newBuilder().version(HttpClient.Version.HTTP_2).uri(URI.create("http://localhost:8080/health")).build();client.send(request, HttpResponse.BodyHandlers.ofString());} catch (Exception e) {e.printStackTrace();}});});executor.shutdown();executor.awaitTermination(1, TimeUnit.MINUTES);System.out.println("Java 21 耗时: " + (System.currentTimeMillis() - startTime) + "ms");}public static void testThread() throws Exception {HttpClient client = HttpClient.newHttpClient();ExecutorService executor = Executors.newFixedThreadPool(10); // 限制线程池大小long startTime = System.currentTimeMillis();IntStream.range(0, 100).forEach(i -> {executor.submit(() -> {try {HttpRequest request = HttpRequest.newBuilder().version(HttpClient.Version.HTTP_2).uri(URI.create("http://localhost:8080/health")).build();client.send(request, HttpResponse.BodyHandlers.ofString());} catch (Exception e) {e.printStackTrace();}});});executor.shutdown();executor.awaitTermination(1, TimeUnit.MINUTES);System.out.println("Java 8 耗时: " + (System.currentTimeMillis() - startTime) + "ms");}
}
附:虚拟线程

可以复习下虚拟内存。

首先是"虚"的,并不是实际那么多内存,但是给你的感觉就是很多内存。怎么做到的,做一些虚拟的映射,然后调换更新,给你错觉就可以了。

看看虚拟内存的关键问题?

  1. 地址映射问题:在访问主存时把虚地址变为主存物理地址(这一过程称为内地址变换);在访问辅存时把虚地址变成辅存的物理地址(这一过程称为外地址变换),以便换页。此外还要解决主存分配、存储保护与程序再定位等问题
  2. 调度问题:决定哪些程序和数据应被调入主存
  3. 替换问题:决定哪些程序和数据应被调出主存
  4. 更新问题:确保主存与辅存的一致性

回到虚拟线程。

一样的道理,设计一种轻量级的调度资源。让多个去绑定一个线程,营造出很多线程的感觉,但是不是真正的内核级别线程。只是一种用异步执行框架设计出来的执行单元。

来看看虚拟线程的关键特性

  1. 轻量级:虚拟线程的创建和销毁成本非常低,通常只需要几十个字节的内存。
  2. 自动上下文管理:虚拟线程会自动管理其上下文(例如,局部变量、异常处理器等),使得开发者不需要手动管理这些上下文。
  3. 易于使用:通过异步编程模型,虚拟线程使得编写异步和非阻塞代码变得更加简单和直观。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【代码】基于CUDA优化的RANSAC实时激光雷达点云地面分割

基于CUDA优化的RANSAC实时激光雷达点云地面分割 摘要: 本文介绍了一个高性能的激光雷达(LiDAR)地面分割项目。该项目基于RANSAC平面估计算法,并通过深度CUDA并行优化,将核心处理时间从近100ms缩短至10ms以内&#xff…

vuex原理以及实现

vuex官方文档 Vuex是什么? Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化 每一个 Vuex 应用的核心就是 store(仓库)。“stor…

APIs案例及知识点串讲(上)

一.轮播图专题CSS代码<style>* {box-sizing: border-box;}.slider {width: 560px;height: 400px;overflow: hidden;}.slider-wrapper {width: 100%;height: 320px;}.slider-wrapper img {width: 100%;height: 100%;display: block;}.slider-footer {height: 80px;backgro…

华大单片机HC32L110烧录程序方法

1&#xff0c;安装J-flash工具 从SEGGER官网下载J-flash工具&#xff0c;地址&#xff1a;SEGGER - The Embedded Experts - Downloads - J-Link / J-Trace。按向导安装完成。 2&#xff0c;使用如下图JLINK工具SWD模式连接单片机的烧录接口&#xff08;SWDIO,SWCLK,GND&#…

LeetCode|Day15|125. 验证回文串|Python刷题笔记

LeetCode&#xff5c;Day15&#xff5c;125. 验证回文串&#xff5c;Python刷题笔记 &#x1f5d3;️ 本文属于【LeetCode 简单题百日计划】系列 &#x1f449; 点击查看系列总目录 >> &#x1f4cc; 题目简介 题号&#xff1a;125. 验证回文串 难度&#xff1a;简单 题…

项目学习笔记 display从none切换成block

跟着视频学做项目的时候&#xff0c;碰到一个多级联动列表&#xff0c;列表元素的display会从none切换成block&#xff0c;切换过程中可能导致资源渲染过多&#xff0c;从而导致卡顿问题。<div class"all-sort-list2"><div class"item" v-for&quo…

从 “洗澡难” 到 “洗得爽”:便携智能洗浴机如何重塑生活?

洗澡本应是日常生活的简单需求&#xff0c;但对于失能老人、行动不便者而言&#xff0c;却可能成为一项充满挑战甚至危险的“艰巨任务”。中国失能、半失能老年人口超过4200万&#xff0c;传统助浴方式存在搬运风险高、隐私难以保障、效率低下等问题&#xff0c;使得“洗澡难”…

鹧鸪云重构光伏发电量预测的精度标准

在当今全球能源转型的大背景下&#xff0c;光伏发电作为一种清洁、可再生的能源形式&#xff0c;正受到越来越多的关注与应用。然而&#xff0c;光伏发电量的精准预测&#xff0c;一直是行业内亟待攻克的关键难题。尤其是在面对复杂多变的气象条件、不同区域的地理环境以及设备…

每日一题(沉淀中)

文章目录 1、 实现string类的接口&#xff0c;并完成测试&#xff0c;要求利用深拷贝和深赋值实现 MyString.h #pragma once #include<iostream> class MyString { private:char* data;//储存字符串内容 public://默认构造函数MyString(const char* str nullptr);////拷…

深入浅出Kafka Producer源码解析:架构设计与编码艺术

一、Kafka Producer全景架构 1.1 核心组件交互图 #mermaid-svg-L9jc09hRQCHb0ftl {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-L9jc09hRQCHb0ftl .error-icon{fill:#552222;}#mermaid-svg-L9jc09hRQCHb0ftl .erro…

微软AutoGen:多智能体协作的工业级解决方案

微软AutoGen&#xff1a;多智能体协作的工业级解决方案 &#x1f31f; 嗨&#xff0c;我是IRpickstars&#xff01; &#x1f30c; 总有一行代码&#xff0c;能点亮万千星辰。 &#x1f50d; 在技术的宇宙中&#xff0c;我愿做永不停歇的探索者。 ✨ 用代码丈量世界&#xf…

终端安全管理系统为什么需要使用,企业需要的桌面管理软件

在当今数字化高度发展的时代&#xff0c;企业和组织的运营计算机等&#xff0c;是企业业务流程的重要节点。终端安全管理系统正挥着至关重要的作用。保障数据安全终端设备往往存储着企业的核心数据&#xff0c;终端安全管理系统可以保障安&#xff0c;未经授权的人员也无法获取…

补环境基础(一) 原型与原型链

1.创建对象的几种方式 1.对象字面量模式 直接使用{}定义键值对&#xff1a; const obj { key: value }; 2.Object()构造函数模式 使用内置构造函数&#xff08;较少使用&#xff09;&#xff1a; const person new Object(); console.log(person)//输出 {}3.构造函数模…

Qt+yolov8目标识别

这是一个基于ONNX Runtime的YOLOv8目标检测项目&#xff0c;支持CPU和GPU加速&#xff0c;使用Qt框架构建图形化界面。摄像头实时画面识别视频文件识别&#xff0c;能正常识别目标&#xff1a;红绿灯&#xff0c;人&#xff0c;公交&#xff0c;巴士&#xff0c;摩托车 等YOLOv…

NLP分词notes

BPE 贪心提取所有出现频率高的成为词。 BPE的训练流程 1.初始化&#xff1a;将所有单个字符作为初始词汇表的元素。 2.迭代合并&#xff1a; 统计语料中所有相邻符号对&#xff08;包括字符和合并后的符号&#xff09;的出现频率。找到出现频率最高的符号对&#xff0c;将其合并…

【数据结构】栈和队列-----数据结构中的双生花

文章目录[toc]栈与队列&#xff1a;数据结构中的双生花1. 栈&#xff1a;后进先出的有序世界1.1 概念及结构剖析1.2 实现方式深度解析数组 vs 链表实现1.3 动态栈实现详解&#xff08;附程序源码&#xff09;1.定义一个动态栈2.初始化3.销毁4.入栈5.出栈6.取栈顶数据7.判空8.获…

Mybatis-2快速入门

学习主线 必学必会属于优化的东西。 快速入门需求说明 要求&#xff1a;开发一个MyBatis项目&#xff0c;通过MyBatis的方式可以完成对monster表的crud操作 1.创建mybatis数据库-monster表 主键Primary Key默认非空Not null&#xff0c;就省略了 create database mybatis us…

Web基础 -java操作数据库

一、JDBCJDBC&#xff1a;&#xff08;Java DataBase Connectivity&#xff09;&#xff0c;就是使用Java语言操作关系型数据库的一套API。为了使用JDBC操作数据库&#xff0c;首先&#xff0c;我们需要在pom.xml文件中引入依赖<dependencies><!-- MySQL JDBC driver …

cell2location复现

https://github.com/BayraktarLab/cell2location/issues/348 根据你已下载的本地 wheel 文件&#xff0c;可以通过以下方式修改安装命令&#xff0c;优先从本地路径安装 jaxlib&#xff0c;同时保持其他依赖的安装方式不变&#xff1a; 解决方案 # 安装 jax (从远程 PyPI 源) p…

什么是 npm、Yarn、pnpm? 有什么区别? 分别适应什么场景?

什么是 npm、Yarn、pnpm? 有什么区别? 分别适应什么场景? 在前端开发中&#xff0c;包管理工具扮演着非常重要的角色。它们帮助开发者高效地管理项目的依赖&#xff0c;确保项目中所需的所有第三方库和工具都能按时安装&#xff0c;并且兼容版本。npm、Yarn 和 pnpm 是三款…