<bdo id="ks4iu"><del id="ks4iu"></del></bdo>
  • 
    <pre id="ks4iu"></pre>
  • <bdo id="ks4iu"><del id="ks4iu"></del></bdo>
    <input id="ks4iu"><em id="ks4iu"></em></input>
    
    
  • <center id="ks4iu"><cite id="ks4iu"></cite></center>
  • 首頁 > 空調 >

    噢,老天爺! 屬于Java的協程終于來了!

    文 | 羅奇奇

    出品 | OSC開源社區(ID:oschina2013)

    OpenJDK 的 JEP 425 :虛擬線程(預覽版)功能提案顯示:Java 平臺將引入虛擬線程特性(期待已久的協程)。虛擬線程是輕量級線程,可顯著地減少編寫、維護和觀察高吞吐量并發應用程序的工作量。

    Java 開發人員一直依賴線程作為并發服務器應用程序的構建塊,每個方法中的語句都在一個線程內執行,每個線程提供一個堆棧來存儲局部變量和協調方法調用,以及報錯時的上下文捕獲。線程是 Java 的并發單元,也是 Java 工具的核心基礎:調試器逐步執行線程方法中的語句,分析器則可視化多個線程的行為。

    目前,JDK 將其平臺線程實現為操作系統 (OS) 線程的包裝器,JDK 中每個實例都是一個平臺線程,平臺線程在底層操作系統線程上運行 Java 代碼 ,并在代碼的整個生命周期內捕獲 OS 線程。平臺線程數受限于 OS 線程數,而 OS 線程的成本很高,不能占用太多。因此,目前 JDK 的這種線程實現方法限制了其應用程序的吞吐量,使吞吐量遠低于硬件支持的水平。

    關于虛擬線程

    虛擬線程java.lang.Thread是在底層操作系統線程(OS 線程)上運行 Java 代碼,但在代碼的整個生命周期內不捕獲 OS 線程的實例。這意味著許多虛擬線程可以在同一個 OS 線程上運行 Java 代碼,從而有效地共享它。

    虛擬線程是由 JDK 而不是操作系統提供的線程的輕量級實現,也是 用戶模式線程的一種形式。用戶模式線程在 Java 的早期版本中被稱為“綠色線程”,當時操作系統線程的概念還不夠成熟和普及, Java 的所有綠色線程都共享一個 OS 線程(M:1 調度),隨著線程概念的發展,綠色線程最終被現在的平臺線程超越,實現為 OS 線程的包裝器(1:1 調度),而最新引入的虛擬線程采用 M:N 調度,其中大量 (M) 虛擬線程被調度為在較少數量 (N) 的 OS 線程上運行。

    更高的吞吐量

    開發者可以選擇使用虛擬線程還是平臺線程,但虛擬線程在高吞吐量的服務器應用程序中表現更好。比如下面這段休眠一秒鐘的代碼就創建了大量的虛擬線程,程序首先獲得一個 ExecutorService,它為每個提交的任務創建一個新的虛擬線程,然后提交 10000 個任務并等待所有任務完成:

    try(var executor = Executors.newVirtualThreadPerTaskExecutor) {

    IntStream.range( 0, 10_000).forEach(i -> {

    executor.submit( -> {

    Thread.sleep(Duration.ofSeconds( 1));

    returni;

    });

    });

    } //executor.close iscalled implicitly, andwaits

    現代硬件可以很容易地支持 10000 個虛擬線程同時運行這樣的代碼。如果該程序使用為每個任務都創建一個新平臺線程的 ExecutorService,例如 Executors.newCachedThreadPool , 那么它將嘗試創建 10000 個平臺線程,也就意味著 10000 個 OS 線程,那么這個程序在大多數操作系統上都會崩潰。又或者這個程序使用從池中獲取平臺線程的 ExecutorService,如 Executors.newFixedThreadPool(200),也好不到哪去。ExecutorService 將創建 200 個平臺線程供這 10000 個任務共享,任務將按順序運行而不是同時運行,程序需要很長時間才能跑完。

    對于上述程序來說,具有 200 個平臺線程的池只能實現每秒 200 個任務的吞吐量,而虛擬線程可以實現大約每秒 10000 個任務的吞吐量(在充分預熱之后)。此外,如果將示例程序中的 10000 更改為 1,000,000 ,則程序將提交 1,000,000 個任務,創建 1,000,000 個并發運行的虛擬線程,并且(在充分預熱后)達到大約 1,000,000 個任務/秒的吞吐量。

    總而言之,虛擬線程不是更快的線程 —— 它們運行代碼的速度并不比平臺線程快。它們的存在是為了提供規模(更高的吞吐量),而不是速度(更低的延遲)。

    如何啟用虛擬線程?

    目前虛擬線程在其他多線程語言中被廣泛使用(例如 Go 中的協程 和 Erlang 中的進程,在 C++ 中也是一個穩定特性),但在 Java 中還是一個預覽 API,默認禁用。如要在 JDK XX 上嘗試該功能,則必須通過以下方法啟用預覽 API:

    使用 javac --release XX --enable-preview Main.java 編譯程序,并使用 java --enable-preview Main 運行 使用源代碼啟動器時,使用 java --release XX --enable-preview Main.java 運行程序 使用 jshell 時,用 jshell --enable-preview 啟動

    有關虛擬線程的更多信息可在 OpenJDK 的 JDK Issue-8277131 中查看,目前該提案于 2021/11/15 創立,目前還處于 JEP 流程的第一階段,距離穩定版本還需要一段時間。

    高手問答

    程序員面試技巧?

    程序員必須要掌握的算法有哪些?

    你有關于算法、編程、數據結構的問題嗎?

    快來在線提問了!

    一起探討算法與數據結構

    覺得不錯,請點個在看

    責任編輯:Rex_08

    關鍵詞: Java 操作系統
    推薦閱讀
    欧美国产在线一区,免费看成年视频网页,国产亚洲福利精品一区,亚洲一区二区约美女探花
    <bdo id="ks4iu"><del id="ks4iu"></del></bdo>
  • 
    <pre id="ks4iu"></pre>
  • <bdo id="ks4iu"><del id="ks4iu"></del></bdo>
    <input id="ks4iu"><em id="ks4iu"></em></input>
    
    
  • <center id="ks4iu"><cite id="ks4iu"></cite></center>
  • 主站蜘蛛池模板: 男朋友想吻我腿中间那个部位| 一男一女的一级毛片| 国产91免费在线观看| 最近韩国电影免费观看完整版中文 | 国产男人女人做性全过程视频| 亚洲欧美日韩中文在线| 99久久国产免费中文无字幕| 男人j桶进女人p无遮挡免费观看 | 国产最新在线视频| 亚洲av无码电影网| 免费在线观看成人| 樱桃视频直播在线观看免费| 国产精品20p| 亚洲av永久无码嘿嘿嘿| 欧美性巨大欧美| 日韩美女乱淫试看视频软件| 国产女主播喷水视频在线观看| 久久国产高清字幕中文| 香蕉97超级碰碰碰免费公| 日本理论片午夜论片 | 亚洲欧美日韩人成| 日韩欧美国产高清| 国产一级片免费看| 三级网站在线免费观看| 精品一区二区三区四区五区六区| 奇米第四色在线播放| 亚洲精品国精品久久99热| 2021果冻传媒剧情在线观看| 欧美三级不卡在线观看| 国产手机精品一区二区| 久久久无码精品午夜| 网友自拍区一区二区三区| 女人下边被添全过视频| 亚洲精品中文字幕无乱码| 一级做a爰片久久毛片唾| 日韩黄色免费观看| 国产igao视频网在线观看hd| 一区二区三区伦理高清| 正在播放宾馆露脸对白视频| 国产精品亚洲二区在线播放| 久久精品欧美日韩精品|