日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

openjdk8 项目结构_OpenJDK织机和结构化并发

發布時間:2023/12/3 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 openjdk8 项目结构_OpenJDK织机和结构化并发 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

openjdk8 項目結構

Project Loom是Hotspot Group贊助的項目之一,旨在向JAVA世界提供高吞吐量和輕量級的并發模型。 在撰寫本文時,Loom項目仍在積極開發中,其API可能會更改。

為什么要織機?

每個新項目可能會出現的第一個問題是為什么?
為什么我們需要學習新的東西,它對我們有幫助? (如果確實如此)

因此,要專門針對Loom回答此問題,我們首先需要了解JAVA中現有線程系統如何工作的基礎知識。

JVM內部產生的每個線程在OS內核空間中都有一個一對一的對應線程,并具有自己的堆棧,寄存器,程序計數器和狀態。 每個線程的最大部分可能是堆棧,堆棧大小以兆字節為單位,通常在1MB到2MB之間。
因此,這些類型的線程在啟動和運行時方面都很昂貴。 不可能在一臺機器上產生1萬個線程并期望它能正常工作。

有人可能會問為什么我們甚至需要那么多線程? 鑒于CPU只有幾個超線程。 例如,CPU Internal Core i9總共有16個線程。
好吧,CPU并不是您的應用程序使用的唯一資源,任何沒有I / O的軟件都只會導致全球變暖!
一旦線程需要I / O,操作系統就會嘗試為其分配所需的資源,并同時調度另一個需要CPU的線程。 因此,我們在應用程序中擁有的線程越多,我們就越可以并行利用這些資源。

一個非常典型的示例是Web服務器。 每臺服務器能夠在每個時間點處理數千個打開的連接,但是同時處理多個連接要么需要數千個線程,要么需要異步非阻塞代碼( 可能會在接下來的幾周內撰寫另一篇文章,以解釋更多有關異步代碼 ),就像前面提到的,成千上萬個OS線程既不是您也不是OS會滿意的!

織機如何提供幫助?

作為Project Loom的一部分,引入了一種稱為Fiber的新型線程。 光纖也稱為虛擬線程綠色線程或用戶線程,因為這些名稱暗示完全由VM處理,并且OS甚至都不知道此類線程存在。 這意味著并非每個VM線程都需要在OS級別具有相應的線程! 虛擬線程可能被I / O阻塞或等待從另一個線程獲取信號,但是,與此同時,其他虛擬線程也可以利用基礎線程!

上圖說明了虛擬線程和OS線程之間的關系。 虛擬線程可以簡單地被I / O阻塞,在這種情況下,基礎線程將被另一個虛擬線程使用。

這些虛擬線程的內存占用量將以千字節為單位,而不是兆字節。 如果需要,可以在生成它們之后擴展它們的堆棧,這樣JVM不需要為它們分配大量內存。

因此,既然我們有一種非常輕巧的方式來實現并發,我們就可以重新考慮存在于Java經典線程中的最佳實踐。

如今,在Java中實現并發最常用的結構是ExecutorService的不同實現。 它們具有非常方便的API,并且相對易于使用。 執行程序服務具有一個內部線程池,用于根據開發人員定義的特征來控制可以產生多少個線程。 該線程池主要用于限制應用程序創建的OS線程的數量,因為如上所述,它們是昂貴的資源,我們應該盡可能地重用它們。 但是現在可以生成輕量級虛擬線程了,我們也可以重新考慮使用ExecutorServices的方式。

結構化并發

結構化并發是一種編程范例,是一種編寫易于讀取和維護的并發程序的結構化方法。 如果代碼對并發任務有明確的入口和出口點,則其主要思想與結構化編程非常相似,與啟動可能比當前作用域更長的并發任務相比,對代碼的推理要容易得多!

為了更清楚地了解結構化并發代碼的外觀,請考慮以下偽代碼:

void notifyUser(User user) { try (var scope = new ConcurrencyScope()) { scope.submit( () -> notifyByEmail(user)); scope.submit( () -> notifyBySMS(user)); } LOGGER.info( "User has been notified successfully" ); }

notifyUser方法應該通過電子郵件和SMS通知用戶,一旦成功完成此方法將記錄一條消息。 使用結構化并發,可以保證在兩種通知方法都完成后立即寫入日志。 換句話說,如果嘗試范圍在其中所有已啟動的并發作業都完成了,那么它將完成!

注意:為了使示例簡單,我們假設notifyByEmail和notifyBySMS在上面的示例中,在內部確實處理所有可能的極端情況,并始終使其通過。

JAVA的結構化并發

在本節中,我將通過一個非常簡單的示例展示如何用JAVA編寫結構化并發應用程序以及Fibers如何幫助擴展應用程序。

我們要解決的問題

想象一下,所有I / O綁定有1萬個任務,而每個任務恰好需要100毫秒才能完成。 我們被要求編寫高效的代碼來完成這些工作。

我們使用下面定義的Job類來模仿我們的工作。

public class Job { public void doIt() { try { Thread.sleep(100l); } catch (InterruptedException e) { e.printStackTrace(); } } }

第一次嘗試

在第一次嘗試中,我們使用緩存線程池OS線程來編寫它

public class ThreadBasedJobRunner implements JobRunner { @Override public long run(List<Job> jobs) { var start = System.nanoTime(); var executor = Executors.newCachedThreadPool(); for (Job job : jobs) { executor.submit(job::doIt); } executor.shutdown(); try { executor.awaitTermination( 1 , TimeUnit.DAYS); } catch (InterruptedException e) { e.printStackTrace(); Thread.currentThread().interrupt(); } var end = System.nanoTime(); long timeSpentInMS = Util.nanoToMS(end - start); ?return timeSpentInMS; } }

在此嘗試中,我們沒有應用Loom項目中的任何內容。 只是一個緩存的線程池,以確保將使用空閑線程,而不是創建新線程。

讓我們看看使用此實現可以運行10,000個作業所需的時間。 我使用下面的代碼來查找運行速度最快的10個代碼。 為簡單起見,未使用任何微基準測試工具。

public class ThreadSleep { public static void main(String[] args) throws InterruptedException { List<Long> timeSpents = new ArrayList<>( 100 ); var jobs = IntStream.range( 0 , 10000 ).mapToObj(n -> new Job()).collect(toList()); for ( int c = 0 ; c <= 100 ; c++) { var jobRunner = new var jobRunner = ThreadBasedJobRunner(); var timeSpent = jobRunner.run(jobs); timeSpents.add(timeSpent); } Collections.sort(timeSpents); System.out.println( "Top 10 executions took:" ); timeSpents.stream().limit( 10 ) .forEach(timeSpent -> System.out.println( "%s ms" .formatted(timeSpent)) ); } }

我的機器上的結果是:

執行死刑前10名:
694毫秒
695毫秒 696毫秒 696毫秒 696毫秒 697毫秒 699毫秒 700毫秒 700毫秒 700毫秒

到目前為止,我們有一個代碼,在最好的情況下,大約需要700毫秒才能在我的計算機上運行10,000個作業。 讓我們這次使用Loom功能實現JobRunner。

第二次嘗試(使用光纖)

在使用FibersVirtual Threads的實現中,我還將以結構化方式對并發進行編碼。

public class FiberBasedJobRunner implements JobRunner { @Override public long run(List<Job> jobs) { var start = System.nanoTime(); var factory = Thread.builder().virtual().factory(); try (var executor = Executors.newUnboundedExecutor(factory)) { for (Job job : jobs) { executor.submit(job::doIt); } } var end = System.nanoTime(); long timeSpentInMS = Util.nanoToMS(end - start); return timeSpentInMS; } }

也許關于此實現的第一個值得注意的事情是它的簡潔性,如果將其與ThreadBasedJobRunner進行比較,您會發現該代碼的行數更少! 主要原因是ExecutorService接口中的新更改現在擴展了Autocloseable ,因此,我們可以在try-with-resources范圍中使用它。 所有提交的作業完成后,將執行try塊之后的代碼。

這正是我們用來在JAVA中編寫結構化并發代碼的主要結構。

上面代碼中的另一個新事物是我們構建線程工廠的新方法。 Thread類有一個稱為builder的新靜態方法,可用于創建ThreadThreadFactory
該行代碼正在創建一個創建虛擬線程的線程工廠

var factory = Thread.builder().virtual().factory();

現在,讓我們看看使用此實現可以運行10,000個作業所需的時間。

執行死刑前10名:
121毫秒
122毫秒 122毫秒 123毫秒 124毫秒 124毫秒 124毫秒 125毫秒 125毫秒 125毫秒

鑒于Project Loom仍在積極開發中,并且仍有提高速度的空間,但結果確實很棒。
不論是全部還是部分應用,都可以以最小的努力受益于Fibers! 唯一需要更改的是線程池的線程工廠 ,僅此而已!

具體來說,在此示例中,應用程序的運行速度提高了約6倍,但是,速度并不是我們在這里獲得的唯一結果!

盡管我不想寫有關使用Fibers大大減少了的應用程序的內存占用的信息,但是我強烈建議您在此訪問本文的代碼,并比較使用的內存量和每個實現占用的OS線程數! 您可以在此處下載Loom的官方早期試用版。

在接下來的帖子中,我將詳細介紹Loom引入的其他API項目,以及我們如何將其應用于現實生活中的用例。

請不要猶豫,通過評論與我分享您的反饋意見

翻譯自: https://www.javacodegeeks.com/2020/02/openjdk-loom-and-structured-concurrency.html

openjdk8 項目結構

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的openjdk8 项目结构_OpenJDK织机和结构化并发的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 午夜剧场福利社 | 亚洲专区中文字幕 | 91精品国产欧美一区二区成人 | 2017狠狠干| 午夜aa| 青青草免费看 | 色噜噜噜 | 综合视频在线 | 日韩一区二区免费视频 | 国产精品精 | 中文字幕在线日韩 | 少妇黄色片 | 亚洲自拍图片 | 欧美偷拍一区二区三区 | 一区二区三区丝袜 | 亚洲AV无码精品色毛片浪潮 | 天天摸天天插 | 日本黄色三级视频 | 欧美日韩一区二区精品 | 啊灬啊灬啊灬秀婷 | 极品尤物一区二区 | 亚洲av无一区二区三区怡春院 | 在线看的免费网站 | www.伊人网 | 丝袜天堂| 久久久久久9 | 国产一级黄色av | 91人人爽| 大粗鳮巴久久久久久久久 | 一区二区久久久 | 日本www免费| www.色悠悠| 日本免费一区二区视频 | 亚洲一区二区人妻 | 国产一级视频 | 狠狠干夜夜爽 | 亚洲欧洲av | 欧美激情综合色综合啪啪五月 | 亚洲成人一区二区三区 | 欧美性理论片在线观看片免费 | 亚洲乱码一区二区 | 国产精品日韩无码 | 伊人久久大香线蕉综合网站 | 欧洲精品码一区二区三区免费看 | 四虎国产精品永久在线国在线 | 国产91视频在线观看 | 禁片天堂 | 黑人乱码一区二区三区av | 日本中文有码 | 色91视频| 亚洲第一第二区 | 青青草在线免费视频 | 成年在线观看视频 | a级片在线| 在线视频欧美亚洲 | 看全色黄大色黄大片女一次牛 | 亚洲激情片| 亚洲一区图片 | 国产精品毛片一区视频播 | 国产高潮久久 | 成人网在线播放 | 一色屋免费视频 | 亚洲国产精品久久久久爰色欲 | 青在线视频 | 一区二区三区四区精品视频 | 免费的av| 成全世界免费高清观看 | 日韩有色| 精品久久久久久一区二区里番 | 午夜精品久久久久 | 夜夜摸夜夜操 | 国产av无码专区亚洲av麻豆 | www插插 | 亚洲情网 | 欧美日本成人 | 久视频在线观看 | 精品播放 | 日韩精品成人免费观看视频 | 91免费短视频 | 欧美精品第一区 | 午夜www| 99看片 | 欧洲自拍偷拍 | av怡红院 | 成年黄色网 | 成人区人妻精品一熟女 | 久久无码视频一区 | 日韩1024| 国产婷婷在线视频 | 亚洲精品理论 | 国产精品高潮呻吟 | xxx麻豆| 久久久久成人网 | 亚洲片国产一区一级在线观看 | av电影网站在线观看 | 一级黄色片免费在线观看 | 久久中文字幕视频 | 日韩天堂在线视频 | 高清在线一区二区 |