AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁 > 科技  > 軟件

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

來源: 責(zé)編: 時間:2024-04-11 09:05:04 166觀看
導(dǎo)讀Java虛擬線程(Virtual Threads)標(biāo)志著Java在并發(fā)編程領(lǐng)域的一次重大飛躍,特別是從Java 21版本開始。這項新技術(shù)的引入旨在克服傳統(tǒng)多線程和線程池存在的挑戰(zhàn)。多線程和線程池在Java中,傳統(tǒng)的多線程編程依賴于Thread類或?qū)?/div>

Java虛擬線程(Virtual Threads)標(biāo)志著Java在并發(fā)編程領(lǐng)域的一次重大飛躍,特別是從Java 21版本開始。這項新技術(shù)的引入旨在克服傳統(tǒng)多線程和線程池存在的挑戰(zhàn)。d8m28資訊網(wǎng)——每日最新資訊28at.com

多線程和線程池

在Java中,傳統(tǒng)的多線程編程依賴于Thread類或?qū)崿F(xiàn)Runnable接口。這些線程都是重量級的,因為每個線程都對應(yīng)一個操作系統(tǒng)級的線程,這意味著線程的創(chuàng)建、調(diào)度和銷毀都需要操作系統(tǒng)的深度參與,不僅耗費資源,也消耗時間。d8m28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片d8m28資訊網(wǎng)——每日最新資訊28at.com

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

下面是一個線程池OutOfMemoryError的例子:d8m28資訊網(wǎng)——每日最新資訊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();    }}

圖片圖片d8m28資訊網(wǎng)——每日最新資訊28at.com

虛擬線程引入

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

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

圖片圖片d8m28資訊網(wǎng)——每日最新資訊28at.com

? 操作系統(tǒng)線程(OS Thread):由操作系統(tǒng)管理,是操作系統(tǒng)調(diào)度的基本單位。d8m28資訊網(wǎng)——每日最新資訊28at.com

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

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

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

使用虛擬線程

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

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

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

ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor();// 創(chuàng)建大量虛擬線程并調(diào)度: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;    });}

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

虛線程的性能

下面我們測試一下虛線程的性能d8m28資訊網(wǎng)——每日最新資訊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();}

下面是測試結(jié)果:d8m28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片d8m28資訊網(wǎng)——每日最新資訊28at.com

虛線程真是快到飛起!!!d8m28資訊網(wǎng)——每日最新資訊28at.com

虛擬線程的原理

Java的虛擬線程會把任務(wù)(java.lang.Runnable實例)包裝到一個 Continuation實例中。當(dāng)任務(wù)需要阻塞掛起的時候,會調(diào)用Continuation 的 yield 操作進(jìn)行阻塞,虛擬線程會從平臺線程卸載。 當(dāng)任務(wù)解除阻塞繼續(xù)執(zhí)行的時候,調(diào)用 Continuation.run會從阻塞點繼續(xù)執(zhí)行。下面讓我們結(jié)合Thread.ofVirtual().start()來看一下虛線程的實現(xiàn)。d8m28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)調(diào)用start()方法時,會創(chuàng)建一個虛擬線程 var thread = newVirtualThread(scheduler, nextThreadName(), characteristics(), task);d8m28資訊網(wǎng)——每日最新資訊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 調(diào)用VirtualThread的構(gòu)造函數(shù):d8m28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片d8m28資訊網(wǎng)——每日最新資訊28at.com

VirtualThread 會初始化一個ForkJoinPool的Executor.d8m28資訊網(wǎng)——每日最新資訊28at.com

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

d8m28資訊網(wǎng)——每日最新資訊28at.com

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

d8m28資訊網(wǎng)——每日最新資訊28at.com

VThreadContinuation是一種允許程序執(zhí)行被暫停并在將來某個時刻恢復(fù)的機制。虛擬線程利用VThreadContinuation來實現(xiàn)輕量級的上下文切換.d8m28資訊網(wǎng)——每日最新資訊28at.com

最后,該方法調(diào)用runContinuation方法。該方法在虛擬線程啟動時被調(diào)用。d8m28資訊網(wǎng)——每日最新資訊28at.com

d8m28資訊網(wǎng)——每日最新資訊28at.com

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

Continuation 組件十分重要,它既是用戶真實任務(wù)的包裝器,同時提供了虛擬線程任務(wù)暫停/繼續(xù)的能力,以及虛擬線程與平臺線程數(shù)據(jù)轉(zhuǎn)移功能,當(dāng)任務(wù)需要阻塞掛起的時候,調(diào)用 Continuation 的 yield 操作進(jìn)行阻塞。當(dāng)任務(wù)需要解除阻塞繼續(xù)執(zhí)行的時候,則調(diào)用 Continuation 的 run 恢復(fù)執(zhí)行。d8m28資訊網(wǎng)——每日最新資訊28at.com

d8m28資訊網(wǎng)——每日最新資訊28at.com

總結(jié)

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

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

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

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

上一篇: 我們一起理解 React 服務(wù)端組件

下一篇: 起飛了,Rust 構(gòu)建 Spin 微服務(wù)框架,毫秒級的冷啟動!

標(biāo)簽:
  • 熱門焦點
  • Redmi Pad評測:紅米充滿野心的一次嘗試

    從Note系列到K系列,從藍(lán)牙耳機到筆記本電腦,紅米不知不覺之間也已經(jīng)形成了自己頗有競爭力的產(chǎn)品體系,在中端和次旗艦市場上甚至要比小米新機的表現(xiàn)來得更好,正所謂“大丈夫生居
  • Java NIO內(nèi)存映射文件:提高文件讀寫效率的優(yōu)秀實踐!

    Java的NIO庫提供了內(nèi)存映射文件的支持,它可以將文件映射到內(nèi)存中,從而可以更快地讀取和寫入文件數(shù)據(jù)。本文將對Java內(nèi)存映射文件進(jìn)行詳細(xì)的介紹和演示。內(nèi)存映射文件概述內(nèi)存
  • 之家push系統(tǒng)迭代之路

    前言在這個信息爆炸的互聯(lián)網(wǎng)時代,能夠及時準(zhǔn)確獲取信息是當(dāng)今社會要解決的關(guān)鍵問題之一。隨著之家用戶體量和內(nèi)容規(guī)模的不斷增大,傳統(tǒng)的靠"主動拉"獲取信息的方式已不能滿足用
  • 這款新興工具平臺,讓你的電腦效率翻倍

    隨著信息技術(shù)的發(fā)展,我們獲取信息的渠道越來越多,但是處理信息的效率卻成為一個瓶頸。于是各種工具應(yīng)運而生,都在爭相解決我們的工作效率問題。今天我要給大家介紹一款效率
  • ESG的面子與里子

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之三伏大幕拉起,各地高溫預(yù)警不絕,但處于厄爾尼諾大&ldquo;烤&rdquo;之下的除了眾生,還有各大企業(yè)發(fā)布的ESG報告。ESG是&ldquo;環(huán)境保
  • 年輕人的“職場羞恥感”,無處不在

    作者:馮曉亭 陶 淘 李 欣 張 琳 馬舒葉來源:燃次元&ldquo;人在職場,應(yīng)該選擇什么樣的著裝?&rdquo;近日,在網(wǎng)絡(luò)上,一個與著裝相關(guān)的帖子引發(fā)關(guān)注,在該帖子里,一位在高級寫字樓亞洲金
  • 小米MIX Fold 3下月亮相:今年唯一無短板的全能折疊屏

    這段時間以來,包括三星、一加、榮耀等等有不少品牌旗下的最新折疊屏旗艦都有新的進(jìn)展,其中榮耀、三星都已陸續(xù)發(fā)布了最新的折疊屏旗艦,尤其號榮耀Magi
  • 8月見!小米MIX Fold 3獲得3C認(rèn)證:支持67W快充

    這段時間以來,包括三星、一加、榮耀等等有不少品牌旗下的最新折疊屏旗艦都得到了不少爆料,而小米新一代折疊屏旗艦——小米MIX Fold 3此前也屢屢被傳
  • 2納米決戰(zhàn)2025

    集微網(wǎng)報道 從三強爭霸到四雄逐鹿,2nm的廝殺聲已然隱約傳來。無論是老牌勁旅臺積電、三星,還是誓言重回先進(jìn)制程領(lǐng)先地位的英特爾,甚至初成立不久的新
Top