了解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
英文地址,請注明出處:http://en.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 是三款…