成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java 上進了,JDK21 要來了,并發編程再也不是噩夢了

商務辦公
當前 Java 中的多線程并發編程絕對是另我們都非常頭疼的一部分,感覺就是學起來難啃,用起來難用。但是轉頭看看使用其他語言的朋友們,根本就沒有這個煩惱嘛,比如 GoLang,感覺人家用起來就很絲滑呢。

大家好,我是一個即將退役的碼農

之前寫過 新項目為什么決定用 JDK 17了,還沒過多久,JDK 21 馬上就出來了,看來 Java 這幾年真的是長進了。

目前 Java 的最新穩定版是 JDK 20,但這是個過渡版,JDK21就是 LTS 版的了,也快要發布了,在今年9月份(也就是2023年9月)就要正式發布了。

但是,猜都不用猜,你肯定還在用 Java 8 吧!

如果說之前的 JDK17你還覺得沒必要折騰,那 JDK21確實有必要關注一下了。因為 JDK21 引入了一種新型的并發編程模式。

當前 Java 中的多線程并發編程絕對是另我們都非常頭疼的一部分,感覺就是學起來難啃,用起來難用。但是轉頭看看使用其他語言的朋友們,根本就沒有這個煩惱嘛,比如 GoLang,感覺人家用起來就很絲滑呢。

JDK21 中就在這方面做了很大的改進,讓Java并發編程變得更簡單一點,更絲滑一點。確切的說,在 JDK19或JDK20中就有這些改進了。

那具體是什么呢?讓我們來具體來看一下。下面是JDK21的 Feature。

其中Virtual Threads、Scoped Values、Structured Concurrency就是針對多線程并發編程的幾個功能。我們今天也主要來說一下他們。

虛擬線程(Virtual Threads)

虛擬線程是基于協程的線程,它們與其他語言中的協程具有相似之處,但也存在一些不同之處。

虛擬線程是依附于主線程的,如果主線程銷毀了,那虛擬線程也不復存在。

相同之處:

  1. 虛擬線程和協程都是輕量級的線程,它們的創建和銷毀的開銷都比傳統的操作系統線程要小。
  2. 虛擬線程和協程都可以通過暫停和恢復來實現線程之間的切換,從而避免了線程上下文切換的開銷。
  3. 虛擬線程和協程都可以使用異步和非阻塞的方式來處理任務,提高應用程序的性能和響應速度。

不同之處:

  1. 虛擬線程是在 JVM 層面實現的,而協程則是在語言層面實現的。因此,虛擬線程的實現可以與任何支持 JVM 的語言一起使用,而協程的實現則需要特定的編程語言支持。
  2. 虛擬線程是一種基于線程的協程實現,因此它們可以使用線程相關的 API,如 ThreadLocal、Lock 和 Semaphore。而協程則不依賴于線程,通常需要使用特定的異步編程框架和 API。
  3. 虛擬線程的調度是由 JVM 管理的,而協程的調度是由編程語言或異步編程框架管理的。因此,虛擬線程可以更好地與其他線程進行協作,而協程則更適合處理異步任務。

總的來說,虛擬線程是一種新的線程類型,它可以提高應用程序的性能和資源利用率,同時也可以使用傳統線程相關的 API。虛擬線程與協程有很多相似之處,但也存在一些不同之處。

虛擬線程確實可以讓多線程編程變得更簡單和更高效。相比于傳統的操作系統線程,虛擬線程的創建和銷毀的開銷更小,線程上下文切換的開銷也更小,因此可以大大減少多線程編程中的資源消耗和性能瓶頸。

使用虛擬線程,開發者可以像編寫傳統的線程代碼一樣編寫代碼,而無需擔心線程的數量和調度,因為 JVM 會自動管理虛擬線程的數量和調度。此外,虛擬線程還支持傳統線程相關的 API,如 ThreadLocal、Lock 和 Semaphore,這使得開發者可以更輕松地遷移傳統線程代碼到虛擬線程。

虛擬線程的引入,使得多線程編程變得更加高效、簡單和安全,使得開發者能夠更加專注于業務邏輯,而不必過多地關注底層的線程管理。

結構化并發(Structured Concurrency)

結構化并發是一種編程范式,旨在通過提供結構化和易于遵循的方法來簡化并發編程。使用結構化并發,開發人員可以創建更容易理解和調試的并發代碼,并且不容易出現競爭條件和其他與并發有關的錯誤。在結構化并發中,所有并發代碼都被結構化為稱為任務的定義良好的工作單元。任務以結構化方式創建、執行和完成,任務的執行總是保證在其父任務完成之前完成。

Structured Concurrency(結構化并發)可以讓多線程編程更加簡單和可靠。在傳統的多線程編程中,線程的啟動、執行和結束是由開發者手動管理的,因此容易出現線程泄露、死鎖和異常處理不當等問題。

使用結構化并發,開發者可以更加自然地組織并發任務,使得任務之間的依賴關系更加清晰,代碼邏輯更加簡潔。結構化并發還提供了一些異常處理機制,可以更好地管理并發任務中的異常,避免因為異常而導致程序崩潰或數據不一致的情況。

除此之外,結構化并發還可以通過限制并發任務的數量和優先級,防止資源競爭和饑餓等問題的發生。這些特性使得開發者能夠更加方便地實現高效、可靠的并發程序,而無需過多關注底層的線程管理。

作用域值(Scoped Values)

作用域值是JDK 20中的一項功能,允許開發人員創建作用域限定的值,這些值限定于特定的線程或任務。作用域值類似于線程本地變量,但是設計為與虛擬線程和結構化并發配合使用。它們允許開發人員以結構化的方式在任務和虛擬線程之間傳遞值,無需復雜的同步或鎖定機制。作用域值可用于在應用程序的不同部分之間傳遞上下文信息,例如用戶身份驗證或請求特定數據。

試驗一下

進行下面的探索之前,你要下載至少 JDK19或者直接下載 JDK20,JDK 20 目前(截止到2023年9月份)是正式發布的最高版本,如果你用 JDK 19的話,沒辦法體驗到Scoped Values的功能。

或者是直接下載 JDK 21 的 Early-Access Builds(早期訪問版本)。在這個地址下載 「jdk.java.net/21/」,下載對應的版…

如果你用的是 IDEA ,那你的IDEA 版本最起碼是2022.3 這個版本或者之后的,否則不支持這么新的 JDK 版本。

如果你用的是 JDK19或者 JDK20的話,要在你的項目設置中將 language level設置為19或20的 Preview 級別,否則編譯的時候會提示你無法使用預覽版的功能,虛擬線程就是預覽版的功能。

如果你用的是 JDK21的話,將 language level 設置為 X -Experimental Features,另外,因為 JDK21不屬于正式版本,所以需要到 IDEA 的設置中(注意是 IDEA 的設置,不是項目的設置了),將這個項目的 Target bytecode version手動修改為21,目前可選的最高就是20,也就是JDK20。設置為21之后,就可以使用 JDK21中的這些功能了。

虛擬線程的例子

我們現在啟動線程是怎么做的呢?

先聲明一個線程類,implements 自 Runnable,并實現 run方法。

然后就可以使用這個線程類,然后啟動線程了。

中規中矩,沒毛病。

有了虛擬線程之后呢,怎么實現呢?

Thread.ofPlatform().name("thread-test").start(new SimpleThread());

下面是幾種使用虛擬線程的方式。

1、直接啟動一個虛擬線程

Thread thread = Thread.startVirtualThread(new SimpleThread());

2、使用 ofVirtual(),builder 方式啟動虛擬線程,可以設置線程名稱、優先級、異常處理等配置

3、使用 Factory 創建線程

4、使用 Executors 方式

結構化編程的例子

想一下下面這個場景,假設你有三個任務要同時進行,只要任意一個任務執行完成并返回結果了,那就可以直接用這個結果了,其他的兩個任務就可以停止了。比如說一個天氣服務,通過三個渠道獲取天氣情況,只要有一個渠道返回就可以了。

這種場景下, 在 Java 8 下應該怎么做呢,當然也可以了。

使用 ExecutorService的invokeAll和invokeAny實現,但是會有一些額外的工作,在拿到第一個結果后,要手動關閉另外的線程。

而 JDK21中呢,可以用結構化編程實現。

ShutdownOnSuccess捕獲第一個結果并關閉任務范圍以中斷未完成的線程并喚醒調用線程。 適用于任意子任務的結果都可以直接使用,并且無需等待其他未完成任務的結果的情況。 它定義了獲取第一個結果或在所有子任務失敗時拋出異常的方法

ShutdownOnFailure

執行多個任務,只要有一個失敗(出現異常或其他主動拋出異常情況),就停止其他未執行完的任務,使用scope.throwIfFailed捕捉并拋出異常。 如果所有任務均正常,則使用 Feture.get() 或*Feture.resultNow() 獲取結果

Scoped Values 的例子

我們肯定都用過 ThreadLocal,它是線程本地變量,只要這個線程沒銷毀,可以隨時獲取 ThredLocal 中的變量值。Scoped Values 也可以在線程內部隨時獲取變量,只不過它有個作用域的概念,超出作用域就會銷毀。

上面的例子模擬一個用戶登錄的過程,使用 ScopedValue.newInstance()聲明了一個 ScopedValue,用 ScopedValue.where給 ScopedValue設置值,并且使用 run 方法執行接下來要做的事兒,這樣一來,ScopedValue就在 run() 的內部隨時可獲取了,在run方法中,模擬調用了一個service 的login方法,不用傳遞LoginUser這個參數,就可以直接通過LoginUser.get方法獲取當前登錄用戶的值了。

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2024-12-24 12:00:00

inlinC++17頭文件

2023-12-28 10:49:27

響應式編程異步

2023-10-20 08:12:00

JDK21線程池配置

2020-01-21 21:15:16

WiFi網絡WiFi6

2023-12-21 09:00:00

開發并發編程

2021-12-21 09:05:46

命令Linux敲錯

2016-02-04 09:17:59

2024-06-06 16:15:00

2023-09-16 13:30:37

AI訓練

2024-04-15 00:08:00

MySQLInnoDB數據庫

2021-01-28 16:58:12

數字貨幣加密貨幣區塊鏈

2023-09-26 12:16:29

JDK 21Java

2024-02-26 00:00:00

Docker容器

2015-05-29 09:01:48

2023-07-29 22:02:06

MyBatis數據庫配置

2020-06-15 08:03:17

大文件OOM內存

2021-12-01 17:24:11

編程學習網站程序員

2022-06-01 10:09:39

Linux網絡延遲

2021-08-12 11:05:07

C++語言內存泄露

2021-03-26 15:18:11

代碼工具Mockoon
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲一区在线日韩在线深爱 | 亚洲天堂精品一区 | 国产色婷婷 | 少妇一级淫片aaaaaaaaa | 精品在线免费观看视频 | 精品96久久久久久中文字幕无 | 国产在线中文字幕 | 国产91亚洲精品一区二区三区 | 成人高清网站 | 久久久精彩视频 | 在线超碰 | 日韩在线视频一区 | 国产激情视频网站 | 农村妇女毛片精品久久久 | 91正在播放 | 羞羞视频在线观看 | 欧美一区2区三区4区公司 | 亚洲一区久久 | 伊人看片 | 中文字幕国产视频 | 亚洲一区中文字幕在线观看 | 五月精品视频 | 91精品国产91久久综合桃花 | 久久亚洲综合 | 亚洲精选久久 | www.玖玖玖 | 久久高清免费视频 | 一级在线观看 | 成人小视频在线免费观看 | 另类二区 | 羞羞视频网站免费观看 | 亚洲日韩中文字幕一区 | 国产成人在线一区二区 | jizz视频 | 国产高清在线精品 | 亚洲视频欧美视频 | 久精品久久| 国产成人精品av | 日韩二三区 | 91一区| 欧美一级二级在线观看 |