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

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

一文搞懂為什么選擇 Java 虛擬線程?

來(lái)源: 責(zé)編: 時(shí)間:2023-11-03 17:07:40 369觀看
導(dǎo)讀 Hello folks,我是 Luga,今天我們來(lái)聊一下 Java 生態(tài)的核心技術(shù)—— Java Virtual Threads,即 “Java 虛擬線程” 。虛擬線程是 Java 中的一個(gè)重要?jiǎng)?chuàng)新,在 Project Loom 項(xiàng)目中開發(fā)的。自從 Java 19 開始作為預(yù)覽功能引入

Hello folks,我是 Luga,今天我們來(lái)聊一下 Java 生態(tài)的核心技術(shù)—— Java Virtual Threads,即 “Java 虛擬線程” 。QiS28資訊網(wǎng)——每日最新資訊28at.com

虛擬線程是 Java 中的一個(gè)重要?jiǎng)?chuàng)新,在 Project Loom 項(xiàng)目中開發(fā)的。自從 Java 19 開始作為預(yù)覽功能引入,到 Java 21 以后成為正式版本(JEP 444),虛擬線程已經(jīng)成為 JDK 的一部分。QiS28資訊網(wǎng)——每日最新資訊28at.com

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

一、為什么是 Java Virtual Threads ?

眾所周知,JVM 是一個(gè)多線程環(huán)境,通過 java.lang.Thread 類型為我們提供了對(duì)操作系統(tǒng)線程的抽象。在 Project Loom 之前,JVM 中的每個(gè)線程都只是對(duì)操作系統(tǒng)線程的一種簡(jiǎn)單封裝,我們可以稱之為“平臺(tái)線程”。QiS28資訊網(wǎng)——每日最新資訊28at.com

然而,所謂的“平臺(tái)線程”,在某些特定的業(yè)務(wù)場(chǎng)景中,往往存在一些問題,從多個(gè)角度來(lái)看,它們都是昂貴的。首先,創(chuàng)建平臺(tái)線程的成本很高。每當(dāng)創(chuàng)建一個(gè)平臺(tái)線程時(shí),操作系統(tǒng)必須在堆棧中分配大量?jī)?nèi)存(以兆字節(jié)計(jì))來(lái)存儲(chǔ)線程的上下文、原生調(diào)用堆棧和 Java 調(diào)用堆棧。由于堆棧大小是固定的,這就導(dǎo)致了高昂的內(nèi)存開銷。此外,每當(dāng)調(diào)度器對(duì)線程進(jìn)行搶占式調(diào)度時(shí),也需要移動(dòng)大量的內(nèi)存。QiS28資訊網(wǎng)——每日最新資訊28at.com

因此,我們可以想象,這在空間和時(shí)間上都是非常昂貴的操作。實(shí)際上,由于堆??蚣艿木薮蟪叽缦拗?,我們對(duì)可創(chuàng)建的線程數(shù)量也存在限制。在 Java 中,我們很容易遇到 OutOfMemoryError,只需不斷實(shí)例化新的平臺(tái)線程,直到操作系統(tǒng)的內(nèi)存耗盡為止。QiS28資訊網(wǎng)——每日最新資訊28at.com

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();  }}

由于平臺(tái)線程的創(chuàng)建成本較高,每個(gè)線程需要分配一定數(shù)量的堆棧內(nèi)存,因此在某些情況下,如果我們不斷實(shí)例化新的平臺(tái)線程,直到操作系統(tǒng)的內(nèi)存耗盡,就有可能迅速觸發(fā) OutOfMemoryError。QiS28資訊網(wǎng)——每日最新資訊28at.com

然而,這個(gè)過程的確切時(shí)間取決于多個(gè)因素,包括可用的內(nèi)存大小、操作系統(tǒng)的線程限制以及 JVM 的配置。如果可用的內(nèi)存較小,同時(shí) JVM 的堆大小也較小,那么在不斷實(shí)例化新的平臺(tái)線程時(shí),很可能會(huì)很快達(dá)到內(nèi)存的極限,導(dǎo)致 OutOfMemoryError 的發(fā)生。QiS28資訊網(wǎng)——每日最新資訊28at.com

[0.949s][warning][os,thread] Failed to start thread "Unknown thread" - pthread_create failed (EAGAIN) for attributes: stacksize: 1024k, guardsize: 4k, detached.[0.949s][warning][os,thread] Failed to start the native thread for java.lang.Thread "Thread-4073"Exception in thread "main" java.lang.OutOfMemoryError: unable to create native thread: possibly out of memory or process/resource limits reached

上述示例展示了我們?nèi)绾位诋?dāng)前的受到限制的環(huán)境中進(jìn)行并發(fā)編程。QiS28資訊網(wǎng)——每日最新資訊28at.com

然而,Java 自從問世以來(lái)一直致力于成為一種簡(jiǎn)單易用的編程語(yǔ)言。在并發(fā)編程領(lǐng)域,我們應(yīng)該像編寫順序代碼一樣編寫程序。事實(shí)上,在 Java 中,為每個(gè)并發(fā)任務(wù)創(chuàng)建一個(gè)新線程是編寫并發(fā)程序更簡(jiǎn)單的方法之一。這種模型被稱為"每個(gè)線程一個(gè)任務(wù)"。QiS28資訊網(wǎng)——每日最新資訊28at.com

接下來(lái),我們來(lái)看一下虛擬線程內(nèi)部架構(gòu),具體如下所示:QiS28資訊網(wǎng)——每日最新資訊28at.com

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

使用這種方法,每個(gè)線程可以使用自己的局部變量來(lái)存儲(chǔ)信息,從而大大減少了共享可變狀態(tài)的需求。線程之間共享狀態(tài)是并發(fā)編程中眾所周知的"棘手部分"。然而,通過每個(gè)線程一個(gè)任務(wù)的模型,我們可以輕松地避免復(fù)雜的線程同步和共享狀態(tài)的問題。QiS28資訊網(wǎng)——每日最新資訊28at.com

然而,正如之前提到的,使用這種方法也存在著限制,即我們能夠創(chuàng)建的線程數(shù)量有限。由于平臺(tái)線程的創(chuàng)建成本較高,每個(gè)線程都需要分配一定數(shù)量的堆棧內(nèi)存,這限制了我們可以創(chuàng)建的線程數(shù)量。如果我們不加限制地創(chuàng)建大量線程,就有可能導(dǎo)致內(nèi)存耗盡和性能下降。QiS28資訊網(wǎng)——每日最新資訊28at.com

需要注意的是,隨著 Project Loom 的引入,虛擬線程的輕量級(jí)特性將顯著改善線程創(chuàng)建成本和內(nèi)存開銷。這將使我們能夠更輕松地創(chuàng)建大規(guī)模的并發(fā)任務(wù),而不會(huì)受到線程數(shù)量限制的困擾。QiS28資訊網(wǎng)——每日最新資訊28at.com

二、那么,如何創(chuàng)建 Virtual Threads ?

正如我們之前所提到的,虛擬線程是一種新型的線程,旨在解決平臺(tái)線程的資源限制問題。它們是 java.lang.Thread 類型的替代實(shí)現(xiàn),將堆幀(Heap Frame)存儲(chǔ)在堆內(nèi)存中,而不是堆棧中。QiS28資訊網(wǎng)——每日最新資訊28at.com

由于虛擬線程的堆棧存儲(chǔ)在堆中,因此它們的初始內(nèi)存占用非常小,通常只有幾百字節(jié),而不是兆字節(jié)。此外,堆棧塊的大小可以動(dòng)態(tài)調(diào)整。這意味著我們不需要為每個(gè)可能的用例分配數(shù)百兆字節(jié)的內(nèi)存。QiS28資訊網(wǎng)——每日最新資訊28at.com

通常而言,創(chuàng)建一個(gè)新的虛擬線程非常簡(jiǎn)單。我們可以使用 java.lang.Thread類 型上的新工廠方法 ofVirtual 來(lái)實(shí)現(xiàn)。讓我們首先定義一個(gè)實(shí)用函數(shù),用于創(chuàng)建具有給定名稱的虛擬線程的示例代碼:QiS28資訊網(wǎng)——每日最新資訊28at.com

import java.lang.Thread;public class VirtualThreadExample {    public static void main(String[] args) {        Thread virtualThread = Thread.ofVirtual("VirtualThreadExample", VirtualThreadExample::runTask);        virtualThread.start();    }        public static void runTask() {        // 在虛擬線程中執(zhí)行的任務(wù)代碼        System.out.println("Running task in virtual thread");    }}

在上面的示例中,我們使用 Thread.ofVirtual 方法創(chuàng)建了一個(gè)名為 "VirtualThreadExample" 的虛擬線程,并指定了要在其中執(zhí)行的任務(wù)代碼。然后,我們調(diào)用 start 方法啟動(dòng)虛擬線程。QiS28資訊網(wǎng)——每日最新資訊28at.com

通過使用虛擬線程,我們可以更加靈活地管理線程的內(nèi)存消耗,并提高并發(fā)程序的性能和可伸縮性。虛擬線程是 Project Loom 的關(guān)鍵特性之一,將極大地改善 Java 中的并發(fā)編程體驗(yàn)。QiS28資訊網(wǎng)——每日最新資訊28at.com

三、Virtual Threads 到底有哪些方面優(yōu)勢(shì)?

作為 Project Loom 提出的一種新的線程模型,即虛擬線程。虛擬線程是一種輕量級(jí)的線程,其堆棧存儲(chǔ)在堆內(nèi)存中,而不是在操作系統(tǒng)線程的堆棧中。這種設(shè)計(jì)使得虛擬線程的創(chuàng)建和銷毀成本較低,并且可以創(chuàng)建大量的線程,而不會(huì)受到操作系統(tǒng)和硬件資源的限制。QiS28資訊網(wǎng)——每日最新資訊28at.com

虛擬線程的引入將改變 Java 中的并發(fā)編程方式。它們可以通過更高效地利用系統(tǒng)資源來(lái)提高并發(fā)性能,并且可以簡(jiǎn)化并發(fā)編程的復(fù)雜性。虛擬線程可以使用更少的內(nèi)存,并且可以根據(jù)需求動(dòng)態(tài)調(diào)整堆棧的大小,以提高資源利用率。QiS28資訊網(wǎng)——每日最新資訊28at.com

具體可參考如下所示:QiS28資訊網(wǎng)——每日最新資訊28at.com

1.減少應(yīng)用程序內(nèi)存消耗

與傳統(tǒng)的由平臺(tái)線程都映射到操作系統(tǒng)線程的生命周期相對(duì)比,虛擬線程通過較小的初始內(nèi)存占用、動(dòng)態(tài)調(diào)整堆棧大小、共享堆棧和更高效的內(nèi)存管理等方式,減少了應(yīng)用程序的內(nèi)存消耗。這使得可以創(chuàng)建更多的線程,提高并發(fā)性能,并且更有效地利用系統(tǒng)資源。QiS28資訊網(wǎng)——每日最新資訊28at.com

2.提高應(yīng)用程序吞吐量

在大多數(shù)架構(gòu)中,應(yīng)用程序可以處理的請(qǐng)求數(shù)量與應(yīng)用程序服務(wù)器線程池中可用的線程數(shù)量成正比。因?yàn)槊總€(gè)客戶請(qǐng)求都由單個(gè)唯一的線程處理。因此,如果可用的線程數(shù)量較少,則只能同時(shí)處理少量請(qǐng)求。這將降低應(yīng)用程序的吞吐量。另一方面,如果應(yīng)用程序服務(wù)器線程池配置了Java虛擬線程,它可以創(chuàng)建明顯更高的線程數(shù)量(數(shù)百萬(wàn)),這將最終提高應(yīng)用程序的吞吐量。QiS28資訊網(wǎng)——每日最新資訊28at.com

此外,在某些應(yīng)用程序中,應(yīng)用程序服務(wù)器線程池中的可用線程在其他計(jì)算資源(如CPU、內(nèi)存、網(wǎng)絡(luò)、存儲(chǔ))飽和之前首先飽和。對(duì)于這樣的虛擬線程來(lái)說(shuō),這將是一個(gè)較大的增強(qiáng)。QiS28資訊網(wǎng)——每日最新資訊28at.com

3.減少無(wú)法創(chuàng)建新的本機(jī)線程的 “OutOfMemoryError” 異常

在 JVM 上運(yùn)行的應(yīng)用程序容易出現(xiàn)“java.lang.OutOfMemoryError:無(wú)法創(chuàng)建新的本機(jī)線程”。這種類型的內(nèi)存錯(cuò)誤通常發(fā)生在如下兩種情況下:QiS28資訊網(wǎng)——每日最新資訊28at.com

  • 當(dāng)應(yīng)用程序創(chuàng)建的線程超過服務(wù)器(或容器)的 RAM 容量時(shí)
  • 當(dāng)應(yīng)用程序創(chuàng)建的線程超過操作系統(tǒng)允許的限制時(shí)(注:在操作系統(tǒng)中,有一個(gè)內(nèi)核限制,該限制規(guī)定了單個(gè)進(jìn)程可以創(chuàng)建的線程數(shù)量)。

通常而言,Java 虛擬線程在減少內(nèi)存消耗方面具有顯著優(yōu)勢(shì)。相比傳統(tǒng)的平臺(tái)線程,Java 虛擬線程通常更輕量級(jí),它們占用的內(nèi)存較少。這使得使用虛擬線程比使用平臺(tái)線程更難達(dá)到 RAM 容量的飽和。QiS28資訊網(wǎng)——每日最新資訊28at.com

傳統(tǒng)的平臺(tái)線程需要分配操作系統(tǒng)線程,并且每個(gè)線程都有一定的內(nèi)存開銷。而虛擬線程在不做實(shí)際工作時(shí),并不需要分配操作系統(tǒng)線程,因此虛擬線程應(yīng)用程序超過操作系統(tǒng)線程限制的可能性要遠(yuǎn)遠(yuǎn)高于傳統(tǒng)的平臺(tái)線程。QiS28資訊網(wǎng)——每日最新資訊28at.com

虛擬線程的輕量級(jí)特性和更高的靈活性使得可以創(chuàng)建更多的線程,而不會(huì)受到操作系統(tǒng)和硬件資源的限制。這進(jìn)一步增加了虛擬線程應(yīng)用程序處理大規(guī)模并發(fā)的能力,提高了系統(tǒng)的可伸縮性。QiS28資訊網(wǎng)——每日最新資訊28at.com

4.提高應(yīng)用程序可用性

在我們主流的系統(tǒng)架構(gòu)中,應(yīng)用程序通常需要與多個(gè)后端系統(tǒng)進(jìn)行通信,如 API、數(shù)據(jù)庫(kù)和第三方框架等。然而,當(dāng)其中一個(gè)后端系統(tǒng)出現(xiàn)中斷或響應(yīng)緩慢時(shí),傳統(tǒng)的應(yīng)用程序服務(wù)器線程會(huì)被阻塞,等待后端系統(tǒng)的響應(yīng)。隨著更多請(qǐng)求進(jìn)入應(yīng)用程序,越來(lái)越多的線程會(huì)被阻塞。在這種情況下,應(yīng)用程序服務(wù)器線程池中的線程數(shù)量是有限的。如果所有線程都被阻塞等待后端系統(tǒng)的響應(yīng),那么就沒有可用線程來(lái)處理新的請(qǐng)求,從而導(dǎo)致整個(gè)應(yīng)用程序不可用。QiS28資訊網(wǎng)——每日最新資訊28at.com

然而,通過將應(yīng)用程序服務(wù)器線程池配置為使用 Java 虛擬線程,可以解決上述問題并提高應(yīng)用程序的可用性。使用虛擬線程,我們甚至可以輕松創(chuàng)建數(shù)百萬(wàn)個(gè)線程,而不會(huì)出現(xiàn)重大問題。當(dāng)虛擬線程被阻塞等待后端系統(tǒng)的響應(yīng)時(shí),它會(huì)像任何其他應(yīng)用程序?qū)ο笠粯?,以非常輕量級(jí)的方式存儲(chǔ)在 Java 堆區(qū)域中。因此,應(yīng)用程序服務(wù)器線程池可以繼續(xù)創(chuàng)建虛擬線程,而不會(huì)耗盡線程池中的線程資源,直到后端系統(tǒng)恢復(fù)。QiS28資訊網(wǎng)——每日最新資訊28at.com

這種優(yōu)化策略為應(yīng)用程序帶來(lái)了巨大的潛力,提高了應(yīng)用程序的可用性。即使在后端系統(tǒng)出現(xiàn)問題時(shí),應(yīng)用程序仍然能夠繼續(xù)創(chuàng)建和處理請(qǐng)求,而不會(huì)因?yàn)榫€程資源的耗盡而導(dǎo)致不可用狀態(tài)。這種靈活性和彈性使得應(yīng)用程序能夠更好地應(yīng)對(duì)高負(fù)載和故障情況,保持穩(wěn)定的運(yùn)行狀態(tài)。QiS28資訊網(wǎng)——每日最新資訊28at.com

Java 虛擬線程提供了現(xiàn)代應(yīng)用程序所需的強(qiáng)大且高效的并發(fā)模型。它簡(jiǎn)化了并發(fā)編程,并帶來(lái)更好的資源利用率,因此有可能徹底改變開發(fā)人員在 Java 中處理并發(fā)代碼的方式。QiS28資訊網(wǎng)——每日最新資訊28at.com

隨著 Java 技術(shù)不斷發(fā)展和創(chuàng)新,了解最新的功能如虛擬線程對(duì)于那些希望保持領(lǐng)先地位并充分利用 Java 生態(tài)系統(tǒng)潛力的開發(fā)人員來(lái)說(shuō)至關(guān)重要。QiS28資訊網(wǎng)——每日最新資訊28at.com

虛擬線程提供了一種輕量級(jí)的線程模型,通過協(xié)作調(diào)度和高效的內(nèi)存管理,大大減少了線程創(chuàng)建和管理的開銷。這使得開發(fā)人員能夠更容易地編寫高性能、高并發(fā)的應(yīng)用程序,而無(wú)需擔(dān)心傳統(tǒng)線程模型的限制和開銷。QiS28資訊網(wǎng)——每日最新資訊28at.com

通過使用虛擬線程,開發(fā)人員可以更好地利用系統(tǒng)資源,提高應(yīng)用程序的并發(fā)性能。虛擬線程的出現(xiàn)為 Java 生態(tài)系統(tǒng)帶來(lái)了更多的潛力和機(jī)會(huì),使得開發(fā)人員能夠更好地應(yīng)對(duì)現(xiàn)代應(yīng)用程序中的并發(fā)需求。QiS28資訊網(wǎng)——每日最新資訊28at.com

因此,對(duì)于那些希望保持領(lǐng)先并充分利用 Java 生態(tài)系統(tǒng)的開發(fā)人員來(lái)說(shuō),了解虛擬線程等先進(jìn)功能是至關(guān)重要的。這將使他們能夠更好地應(yīng)對(duì)并發(fā)編程挑戰(zhàn),并構(gòu)建出高性能、可擴(kuò)展的應(yīng)用程序,從而在競(jìng)爭(zhēng)激烈的軟件開發(fā)市場(chǎng)中脫穎而出。QiS28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-16863-0.html一文搞懂為什么選擇 Java 虛擬線程?

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

上一篇: 在 GORM 中定義模型

下一篇: 使用 SwiftUI 創(chuàng)建一個(gè)靈活的選擇器

標(biāo)簽:
  • 熱門焦點(diǎn)
  • Redmi Pad評(píng)測(cè):紅米充滿野心的一次嘗試

    從Note系列到K系列,從藍(lán)牙耳機(jī)到筆記本電腦,紅米不知不覺之間也已經(jīng)形成了自己頗有競(jìng)爭(zhēng)力的產(chǎn)品體系,在中端和次旗艦市場(chǎng)上甚至要比小米新機(jī)的表現(xiàn)來(lái)得更好,正所謂“大丈夫生居
  • 小米降噪藍(lán)牙耳機(jī)Necklace分享:聽一首歌 讀懂一個(gè)故事

    在今天下午的小米Civi 2新品發(fā)布會(huì)上,小米還帶來(lái)了一款新的降噪藍(lán)牙耳機(jī)Necklace,我們也在發(fā)布結(jié)束的第一時(shí)間給大家?guī)?lái)這款耳機(jī)的簡(jiǎn)單分享?,F(xiàn)在大家能見到最多的藍(lán)牙耳機(jī)
  • 0糖0卡0脂 旭日森林仙草烏龍茶優(yōu)惠:15瓶到手29元

    旭日森林無(wú)糖仙草烏龍茶510ml*15瓶平時(shí)要賣為79.9元,今日下單領(lǐng)取50元優(yōu)惠券,到手價(jià)為29.9元。產(chǎn)品規(guī)格:0糖0卡0脂,添加草本仙草汁,清涼爽口,富含茶多酚,保留
  • 把LangChain跑起來(lái)的三個(gè)方法

    使用LangChain開發(fā)LLM應(yīng)用時(shí),需要機(jī)器進(jìn)行GLM部署,好多同學(xué)第一步就被勸退了,那么如何繞過這個(gè)步驟先學(xué)習(xí)LLM模型的應(yīng)用,對(duì)Langchain進(jìn)行快速上手?本片講解3個(gè)把LangChain跑起來(lái)
  • 之家push系統(tǒng)迭代之路

    前言在這個(gè)信息爆炸的互聯(lián)網(wǎng)時(shí)代,能夠及時(shí)準(zhǔn)確獲取信息是當(dāng)今社會(huì)要解決的關(guān)鍵問題之一。隨著之家用戶體量和內(nèi)容規(guī)模的不斷增大,傳統(tǒng)的靠"主動(dòng)拉"獲取信息的方式已不能滿足用
  • 網(wǎng)紅炒股不為了賺錢,那就是耍流氓!

    來(lái)源:首席商業(yè)評(píng)論6月26日高調(diào)宣布入市,網(wǎng)絡(luò)名嘴大v胡錫進(jìn)居然進(jìn)軍了股市。在一次財(cái)經(jīng)媒體峰會(huì)上,幾個(gè)財(cái)經(jīng)圈媒體大佬就&ldquo;胡錫進(jìn)炒股是否知道認(rèn)真報(bào)道&rdquo;展開討論。有
  • 三星電子Q2營(yíng)收60萬(wàn)億韓元 存儲(chǔ)業(yè)務(wù)營(yíng)收同比仍下滑超過50%

    7月27日消息,據(jù)外媒報(bào)道,從三星電子所發(fā)布的財(cái)報(bào)來(lái)看,他們主要利潤(rùn)來(lái)源的存儲(chǔ)芯片業(yè)務(wù)在今年二季度仍不樂觀,營(yíng)收同比仍在大幅下滑,所在的設(shè)備解決方案
  • 三星推出Galaxy Tab S9系列平板電腦以及Galaxy Watch6系列智能手表

    2023年7月26日,三星電子正式發(fā)布了Galaxy Z Flip5與Galaxy Z Fold5。除此之外,Galaxy Tab S9系列平板電腦以及三星Galaxy Watch6系列智能手表也同期
  • iQOO 11S新品發(fā)布會(huì)

    iQOO將在7月4日19:00舉行新品發(fā)布會(huì),推出杭州亞運(yùn)會(huì)電競(jìng)賽事官方用機(jī)iQOO 11S。
Top 主站蜘蛛池模板: 宁津县| 横山县| 玉龙| 沙洋县| 盱眙县| 正阳县| 周至县| 天祝| 沁水县| 大宁县| 游戏| 合水县| 鞍山市| 徐汇区| 客服| 永靖县| 扎鲁特旗| 清新县| 平谷区| 平泉县| 蚌埠市| 莎车县| 临西县| 仙游县| 淄博市| 汉源县| 剑川县| 凤翔县| 余干县| 正阳县| 霸州市| 马山县| 淅川县| 东兰县| 济宁市| 融水| 敦化市| 西贡区| 株洲市| 遵化市| 定安县|