日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

多線程回答的滾瓜爛熟,面試官問我虛線程了解嗎?我說不太了解!

來源: 責編: 時間:2024-04-11 09:05:04 258觀看
導讀Java虛擬線程(Virtual Threads)標志著Java在并發編程領域的一次重大飛躍,特別是從Java 21版本開始。這項新技術的引入旨在克服傳統多線程和線程池存在的挑戰。多線程和線程池在Java中,傳統的多線程編程依賴于Thread類或實

Java虛擬線程(Virtual Threads)標志著Java在并發編程領域的一次重大飛躍,特別是從Java 21版本開始。這項新技術的引入旨在克服傳統多線程和線程池存在的挑戰。FP528資訊網——每日最新資訊28at.com

多線程和線程池

在Java中,傳統的多線程編程依賴于Thread類或實現Runnable接口。這些線程都是重量級的,因為每個線程都對應一個操作系統級的線程,這意味著線程的創建、調度和銷毀都需要操作系統的深度參與,不僅耗費資源,也消耗時間。FP528資訊網——每日最新資訊28at.com

圖片圖片FP528資訊網——每日最新資訊28at.com

為了優化資源使用和提高效率,Java提供了線程池(ExecutorService等)。線程池可以重用固定數量的線程,避免了頻繁創建和銷毀線程的開銷。然而,即使是線程池也無法完全解決上下文切換和資源消耗的問題,尤其是在高并發場景下。此外,大量的線程創建還可能導致OutOfMemoryError。FP528資訊網——每日最新資訊28at.com

下面是一個線程池OutOfMemoryError的例子:FP528資訊網——每日最新資訊28at.com

public static void main(String[] args) {    stackOverFlowErrorExample();}private static void stackOverFlowErrorExample() {    for (int i = 0; i < 100_000; i++) {        new Thread(() -> {            try {                Thread.sleep(Duration.ofSeconds(1L));            } catch (InterruptedException e) {                throw new RuntimeException(e);            }        }).start();    }}

圖片圖片FP528資訊網——每日最新資訊28at.com

虛擬線程引入

為了進一步提高并發編程的效率和簡化開發過程,Java19引入了虛擬線程概念。這些輕量級的線程在JVM的用戶模式下被管理,而不是直接映射到操作系統的線程上。這種設計使得可以創建數百萬個虛擬線程,而對操作系統資源的消耗微乎其微。FP528資訊網——每日最新資訊28at.com

當代碼調用到阻塞操作時例如 IO、同步、Sleep等操作時,JVM 會自動把 Virtual Thread 從平臺線程上卸載,平臺線程就會去處理下一個虛擬線程,通過這種方式,提升了平臺線程的利用率,讓平臺線程不再阻塞在等待上,從底層實現了少量平臺線程就可以處理大量請求,提高了服務吞吐和 CPU 的利用率。FP528資訊網——每日最新資訊28at.com

圖片圖片FP528資訊網——每日最新資訊28at.com

? 操作系統線程(OS Thread):由操作系統管理,是操作系統調度的基本單位。FP528資訊網——每日最新資訊28at.com

? 平臺線程(Platform Thread):傳統方式使用的Java.Lang.Thread,都是一個平臺線程,是 Java 對操作系統線程的包裝,與操作系統是 1:1 映射。FP528資訊網——每日最新資訊28at.com

? 虛擬線程(Virtual Thread):一種輕量級,由 JVM 管理的線程。對應的實例 java.lang.VirtualThread 這個類。FP528資訊網——每日最新資訊28at.com

? 載體線程(Carrier Thread):指真正負責執行虛擬線程中任務的平臺線程。一個虛擬線程裝載到一個平臺線程之后,那么這個平臺線程就被稱為虛擬線程的載體線程。FP528資訊網——每日最新資訊28at.com

使用虛擬線程

虛擬線程的使用接口與普通線程相似,但創建虛擬線程的方式略有不同。以下是幾種創建和使用虛擬線程的方法:FP528資訊網——每日最新資訊28at.com

  • 直接創建虛擬線程并運行:
// 傳入Runnable實例并立刻運行:Thread vt = Thread.startVirtualThread(() -> {    System.out.println("Start virtual thread...");    Thread.sleep(10);    System.out.println("End virtual thread.");});
  • 創建虛擬線程但不自動運行,而是手動調用start()開始運行:
// 創建VirtualThread:Thread.ofVirtual().unstarted(() -> {    System.out.println("Start virtual thread...");    Thread.sleep(1000);    System.out.println("End virtual thread.");});// 運行:vt.start();
  • 通過虛擬線程的ThreadFactory創建虛擬線程,然后手動調用start()開始運行:
// 創建ThreadFactory:ThreadFactory tf = Thread.ofVirtual().factory();// 創建VirtualThread:Thread vt = tf.newThread(() -> {    System.out.println("Start virtual thread...");    Thread.sleep(1000);    System.out.println("End virtual thread.");});// 運行:vt.start();

直接調用start()實際上是由ForkJoinPool的線程來調度的。我們也可以自己創建調度線程,然后運行虛擬線程:FP528資訊網——每日最新資訊28at.com

ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor();// 創建大量虛擬線程并調度:ThreadFactory tf = Thread.ofVirtual().factory();for (int i=0; i<100_000; i++) {    Thread vt = tf.newThread(() -> { ... });    executor.submit(vt);    executor.submit(() -> {        System.out.println("Start virtual thread...");        Thread.sleep(Duration.ofSeconds(1L));        System.out.println("End virtual thread.");        return true;    });}

由于虛擬線程屬于非常輕量級的資源,因此,用時創建,用完就扔,不要池化虛擬線程。FP528資訊網——每日最新資訊28at.com

虛線程的性能

下面我們測試一下虛線程的性能FP528資訊網——每日最新資訊28at.com

public static void main(String[] args) {    testWithVirtualThread();    testWithThread(20);    testWithThread(50);    testWithThread(100);    testWithThread(200);    testWithThread(400);}private static long testWithVirtualThread() {    long start = System.currentTimeMillis();    ExecutorService es = Executors.newVirtualThreadPerTaskExecutor();    for (int i = 0; i < TASK_NUM; i++) {        es.submit(() -> {            Thread.sleep(100);            return 0;        });    }    es.close();    long end = System.currentTimeMillis();    System.out.println("virtual thread:" + (end - start));    return end;}private static void testWithThread(int threadNum) {    long start = System.currentTimeMillis();    ExecutorService es = Executors.newFixedThreadPool(threadNum);    for (int i = 0; i < TASK_NUM; i++) {        es.submit(() -> {            Thread.sleep(100);            return 0;        });    }    es.close();    System.out.println(threadNum + " thread:" + (System.currentTimeMillis() - start));    es.shutdown();}

下面是測試結果:FP528資訊網——每日最新資訊28at.com

圖片圖片FP528資訊網——每日最新資訊28at.com

虛線程真是快到飛起!!!FP528資訊網——每日最新資訊28at.com

虛擬線程的原理

Java的虛擬線程會把任務(java.lang.Runnable實例)包裝到一個 Continuation實例中。當任務需要阻塞掛起的時候,會調用Continuation 的 yield 操作進行阻塞,虛擬線程會從平臺線程卸載。 當任務解除阻塞繼續執行的時候,調用 Continuation.run會從阻塞點繼續執行。下面讓我們結合Thread.ofVirtual().start()來看一下虛線程的實現。FP528資訊網——每日最新資訊28at.com

當調用start()方法時,會創建一個虛擬線程 var thread = newVirtualThread(scheduler, nextThreadName(), characteristics(), task);FP528資訊網——每日最新資訊28at.com

static Thread newVirtualThread(Executor scheduler,                                   String name,                                   int characteristics,                                   Runnable task) {        if (ContinuationSupport.isSupported()) {            return new VirtualThread(scheduler, name, characteristics, task);        } else {            if (scheduler != null)                throw new UnsupportedOperationException();            return new BoundVirtualThread(name, characteristics, task);        }    }

核心主要在java.lang.VirtualThread類中。下面是JVM 調用VirtualThread的構造函數:FP528資訊網——每日最新資訊28at.com

圖片圖片FP528資訊網——每日最新資訊28at.com

VirtualThread 會初始化一個ForkJoinPool的Executor.FP528資訊網——每日最新資訊28at.com

private static final ForkJoinPool DEFAULT_SCHEDULER = createDefaultScheduler(); 該方法初始化Executor線程池大小。該Executor 也就是執行器,提供了一個默認的 FIFO 的 ForkJoinPool 用于執行虛擬線程任務。FP528資訊網——每日最新資訊28at.com

FP528資訊網——每日最新資訊28at.com

之后創建一個VThreadContinuation對象。該對象存儲作為Runnable對象運行的信息,它確保了每個并發操作都有清晰定義的生命周期和上下文。FP528資訊網——每日最新資訊28at.com

FP528資訊網——每日最新資訊28at.com

VThreadContinuation是一種允許程序執行被暫停并在將來某個時刻恢復的機制。虛擬線程利用VThreadContinuation來實現輕量級的上下文切換.FP528資訊網——每日最新資訊28at.com

最后,該方法調用runContinuation方法。該方法在虛擬線程啟動時被調用。FP528資訊網——每日最新資訊28at.com

FP528資訊網——每日最新資訊28at.com

JVM 把虛擬線程分配給平臺線程的操作稱為 mount(掛載),取消分配平臺線程的操作稱為 unmount(卸載)。FP528資訊網——每日最新資訊28at.com

Continuation 組件十分重要,它既是用戶真實任務的包裝器,同時提供了虛擬線程任務暫停/繼續的能力,以及虛擬線程與平臺線程數據轉移功能,當任務需要阻塞掛起的時候,調用 Continuation 的 yield 操作進行阻塞。當任務需要解除阻塞繼續執行的時候,則調用 Continuation 的 run 恢復執行。FP528資訊網——每日最新資訊28at.com

FP528資訊網——每日最新資訊28at.com

總結

虛擬線程是由 Java 虛擬機調度,它的占用空間小,同時使用輕量級的任務隊列來調度虛擬線程,避免了線程間基于內核的上下文切換開銷,因此可以極大量地創建和使用。主要有以下好處:FP528資訊網——每日最新資訊28at.com

  • 虛擬線程是輕量級的,它們不直接映射到操作系統的線程,而是由JVM在用戶態進行管理。這種輕量級特性允許在單個JVM實例中同時運行數百萬個虛擬線程。
  • 虛擬線程大大簡化了并發編程的復雜性。開發者可以像編寫順序代碼一樣編寫并發代碼,而無需擔心傳統線程編程中的許多復雜問題,如線程數、同步和資源競爭等。

本文鏈接:http://m.www897cc.com/showinfo-26-82755-0.html多線程回答的滾瓜爛熟,面試官問我虛線程了解嗎?我說不太了解!

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 我們一起理解 React 服務端組件

下一篇: 起飛了,Rust 構建 Spin 微服務框架,毫秒級的冷啟動!

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
日韩视频免费看| 国产一区二区毛片| 麻豆成人av| 欧美v日韩v国产v| 欧美日韩一区二区三区| 国产精品一区二区三区观看| 国内精品免费在线观看| 亚洲黄色有码视频| 在线中文字幕日韩| 久久av红桃一区二区小说| 嫩模写真一区二区三区三州| 国产精品高潮呻吟| 在线成人激情视频| 一区二区三区日韩欧美| 欧美一区二区视频97| 欧美国产日韩a欧美在线观看| 久久看片网站| 欧美日韩另类综合| 国产一区二区三区精品欧美日韩一区二区三区 | 欧美一二三视频| 麻豆精品传媒视频| 欧美日韩国产一级片| 国产一区91| 亚洲天堂成人在线视频| 久久综合激情| 国产精品久在线观看| 亚洲高清视频中文字幕| 亚洲欧美日韩一区二区三区在线| 久久久久五月天| 国产精品二区影院| 亚洲人成在线观看| 欧美一区二区日韩| 欧美日本国产精品| 激情久久五月| 亚洲欧美在线网| 欧美精品一区二区三区视频| 韩国欧美国产1区| 亚洲自拍偷拍麻豆| 欧美精品久久99久久在免费线| 国产欧美一区二区三区久久 | 亚洲成色精品| 午夜欧美视频| 国产日韩欧美视频在线| 亚洲激情小视频| 久久av一区二区| 欧美日韩精品免费观看视一区二区| 国产日韩欧美在线| 中文在线一区| 欧美精品久久久久a| 尤妮丝一区二区裸体视频| 午夜精品免费在线| 欧美视频免费在线| 亚洲区一区二区三区| 久久久久久久综合| 国产日韩欧美在线视频观看| 日韩亚洲欧美高清| 欧美高清自拍一区| 亚洲高清免费| 久久久久久999| 国产性猛交xxxx免费看久久| 亚洲嫩草精品久久| 国产精品yjizz| 一区二区三欧美| 欧美人妖在线观看| 日韩视频不卡| 欧美精品一区二区三区四区 | 永久555www成人免费| 久久国产精品99国产精| 国产欧美亚洲一区| 欧美一区二区三区在线看| 国产精品自拍网站| 亚洲欧美日韩在线综合| 国产精品毛片a∨一区二区三区|国| 亚洲精品久久久久久久久久久久| 久久精品99国产精品| 国产日韩免费| 久久av二区| 国内精品嫩模av私拍在线观看| 午夜亚洲伦理| 国产女主播在线一区二区| 亚洲欧美国产日韩中文字幕| 国产精品视频内| 性欧美xxxx视频在线观看| 国产欧美 在线欧美| 欧美一区国产一区| 国产一区二区三区精品久久久| 午夜精品久久久久久久99热浪潮| 国产精品福利久久久| 亚洲欧美日韩精品久久亚洲区 | 欧美色图五月天| 亚洲视频免费| 国产精品区免费视频| 午夜精品国产| 韩日成人av| 老司机免费视频久久| 91久久精品久久国产性色也91| 米奇777超碰欧美日韩亚洲| 亚洲激情第一页| 欧美日韩不卡合集视频| 亚洲视频一二区| 国产精品一区二区在线| 久久国内精品自在自线400部| 国产精品婷婷| 久久久久久网| 亚洲日韩中文字幕在线播放| 欧美日韩视频在线| 午夜精品久久久久久久99黑人| 国产乱码精品一区二区三区忘忧草 | 亚洲人成精品久久久久| 欧美激情久久久| 亚洲社区在线观看| 国产欧美日韩综合精品二区| 久久久美女艺术照精彩视频福利播放| 国产精品国产亚洲精品看不卡15| 亚洲香蕉视频| 国产一区二区三区在线免费观看| 久久久精品国产一区二区三区| 精品不卡一区二区三区| 欧美激情精品久久久久久大尺度| 99精品国产热久久91蜜凸| 国产精品免费久久久久久| 久久久精品性| 99精品久久久| 国产欧美一区二区精品仙草咪| 久久人人97超碰国产公开结果| 亚洲国产一区二区视频| 欧美午夜性色大片在线观看| 久久精品中文字幕一区| 99re热精品| 国产香蕉久久精品综合网| 欧美精品日韩综合在线| 羞羞色国产精品| 亚洲国产日韩一级| 国产精品视频免费在线观看| 久久深夜福利| 欧美福利视频网站| 亚洲宅男天堂在线观看无病毒| 国产偷久久久精品专区| 欧美精品激情在线| 欧美在线观看视频一区二区| 亚洲乱码一区二区| 国产一区二区三区四区老人| 欧美日韩国产一区二区| 久久久av水蜜桃| 亚洲午夜小视频| 精品91视频| 国产精品久久久久久亚洲毛片| 久久青青草原一区二区| 亚洲一区国产| 91久久久一线二线三线品牌| 国产色综合久久| 欧美视频1区| 免费视频久久| 香蕉尹人综合在线观看| 日韩午夜在线视频| 在线看片日韩| 国产日韩欧美一区二区| 欧美日韩免费一区二区三区视频| 久久久久se| 亚洲欧美另类在线观看| 日韩视频一区| **网站欧美大片在线观看| 国产精品网站在线播放| 欧美日韩极品在线观看一区| 美女露胸一区二区三区| 久久成人18免费观看| 亚洲一区二区三区精品视频| 亚洲精品影院在线观看| 亚洲成人资源| 黄色日韩网站| 国产日韩欧美在线一区| 欧美婷婷久久| 欧美日韩高清不卡| 欧美国产日韩一区二区三区| 久久一区二区三区av| 久久成人这里只有精品| 午夜精品久久久久久久99热浪潮| 亚洲美女电影在线| 亚洲狠狠婷婷| 亚洲成人资源网| 一区二区三区在线免费视频 | 黄色一区二区三区| 国产日韩精品久久久| 国产精品日本欧美一区二区三区| 欧美精品免费看| 欧美大片一区| 欧美α欧美αv大片| 另类图片国产| 久久一区二区三区超碰国产精品| 香港成人在线视频| 亚洲综合视频一区| 亚洲在线免费| 亚洲一卡久久| 亚洲在线国产日韩欧美| 亚洲一区二区精品视频| 一本不卡影院| 一区二区三区导航| 中日韩午夜理伦电影免费| av不卡在线看| 亚洲午夜精品久久久久久浪潮 | 乱人伦精品视频在线观看| 久久婷婷蜜乳一本欲蜜臀| 久久精视频免费在线久久完整在线看| 亚洲欧美日韩网|