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

當前位置:首頁 > 科技  > 軟件

聊一聊Java 21,虛擬線程、結構化并發和作用域值

來源: 責編: 時間:2023-09-28 10:08:48 387觀看
導讀如果你仍然認為之前的JDK 17沒有太多改變,那么JDK 21需要引起你的注意。因為JDK 21引入了一種新型的并發編程模型。目前在Java中的多線程并發編程是我們頭痛的另一部分。感覺學起來很困難,使用起來也很復雜。但是回頭看

如果你仍然認為之前的JDK 17沒有太多改變,那么JDK 21需要引起你的注意。因為JDK 21引入了一種新型的并發編程模型。zt628資訊網——每日最新資訊28at.com

目前在Java中的多線程并發編程是我們頭痛的另一部分。感覺學起來很困難,使用起來也很復雜。但是回頭看看使用其他語言的朋友,他們根本沒有這種麻煩,比如GoLang,使用起來非常順暢。zt628資訊網——每日最新資訊28at.com

zt628資訊網——每日最新資訊28at.com

JDK 21在這個領域取得了巨大的改進,使Java并發編程變得更加簡單和順暢。更準確地說,這些改進在JDK 19或JDK 20中已經存在。zt628資訊網——每日最新資訊28at.com

zt628資訊網——每日最新資訊28at.com

1*wtYzgJzJD8rGtysVoIW1cw.pngzt628資訊網——每日最新資訊28at.com

其中,虛擬線程、作用域值和結構化并發是多線程并發編程的一些功能。zt628資訊網——每日最新資訊28at.com

一、虛擬線程

虛擬線程是基于協程的線程,類似于其他語言中的協程,但也有一些區別。zt628資訊網——每日最新資訊28at.com

虛擬線程附加在主線程上。如果主線程被銷毀,虛擬線程將不再存在。zt628資訊網——每日最新資訊28at.com

相似之處:zt628資訊網——每日最新資訊28at.com

  • 虛擬線程和協程都很輕量級,它們的創建和銷毀開銷比傳統操作系統線程要小。
  • 虛擬線程和協程都可以通過掛起和恢復來在線程之間切換,從而避免了線程上下文切換的開銷。
  • 虛擬線程和協程都可以以異步和非阻塞的方式處理任務,提高了應用程序的性能和響應能力。

不同之處:zt628資訊網——每日最新資訊28at.com

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

總的來說,虛擬線程是一種新的線程類型,可以提高應用程序的性能和資源利用率,同時還可以使用傳統的與線程相關的API。虛擬線程與協程有許多相似之處,但也存在一些不同之處。zt628資訊網——每日最新資訊28at.com

虛擬線程確實可以使多線程編程更加簡單和高效。與傳統的操作系統線程相比,創建和銷毀虛擬線程的開銷更小,線程上下文切換的開銷也更小,因此可以大大減少多線程編程中的資源消耗和性能瓶頸。zt628資訊網——每日最新資訊28at.com

使用虛擬線程,開發人員可以像編寫傳統線程代碼一樣編寫代碼,而不必擔心線程的數量和調度,因為JVM會自動管理虛擬線程的數量和調度。此外,虛擬線程還支持傳統的與線程相關的API,如ThreadLocal、Lock和Semaphore,這使得開發人員更容易將傳統線程代碼遷移到虛擬線程中。zt628資訊網——每日最新資訊28at.com

虛擬線程的引入使多線程編程更加高效、簡單和安全,允許開發人員更多關注業務邏輯,而不必過多關注底層線程管理。zt628資訊網——每日最新資訊28at.com

二、結構化并發

結構化并發是一種旨在通過提供結構化且易于遵循的方法來簡化并發編程的編程范例。使用結構化并發,開發人員可以創建更容易理解和調試、不容易出現競態條件和其他與并發相關的錯誤的并發代碼。在結構化并發中,所有并發代碼都被結構化為稱為任務的明確定義的工作單元。任務以結構化的方式創建、執行和完成,任務的執行始終保證在其父任務完成之前完成。zt628資訊網——每日最新資訊28at.com

結構化并發可以使多線程編程更加簡單和可靠。在傳統的多線程編程中,線程的啟動、執行和終止都是由開發人員手動管理的,因此容易出現線程泄漏、死鎖和不正確的異常處理等問題。zt628資訊網——每日最新資訊28at.com

使用結構化并發,開發人員可以更自然地組織并發任務,使任務之間的依賴關系更清晰,代碼邏輯更簡潔。結構化并發還提供了一些異常處理機制,以更好地管理并發任務中的異常,避免由異常引起的程序崩潰或數據不一致。zt628資訊網——每日最新資訊28at.com

此外,結構化并發還可以通過限制并發任務的數量和優先級來防止資源zt628資訊網——每日最新資訊28at.com

競爭和饑餓現象。這些特性使得開發人員能夠更容易地實現高效且可靠的并發程序,而不必過多關注底層線程管理。zt628資訊網——每日最新資訊28at.com

三、作用域值

作用域值是JDK 20中的一項功能,允許開發人員創建僅限于特定線程或任務的作用域值。作用域值類似于線程本地變量,但設計用于與虛擬線程和結構化并發一起使用。它們允許開發人員以結構化的方式在不同部分的應用程序之間傳遞上下文信息,例如用戶身份驗證或請求特定數據。zt628資訊網——每日最新資訊28at.com

四、實踐

在繼續以下探索之前,您需要至少下載JDK 19或直接下載JDK 20。截止到2023年9月,JDK 20是官方發布的最高版本。如果使用JDK 19,您將無法體驗到Scoped Values功能。zt628資訊網——每日最新資訊28at.com

zt628資訊網——每日最新資訊28at.com

1*GQ22_fxZ-eRKk85BBXuHWQ.pngzt628資訊網——每日最新資訊28at.com

或者直接下載JDK 21的早期訪問版本。zt628資訊網——每日最新資訊28at.com

zt628資訊網——每日最新資訊28at.com

1*0hHWnZaMVfsKlVCLjMJUSg.pngzt628資訊網——每日最新資訊28at.com

如果您使用的是IDEA,則您的IDEA版本必須至少為2022.3或更高版本,否則不支持這樣的新JDK版本。zt628資訊網——每日最新資訊28at.com

如果您使用的是JDK 19或JDK 20,您應該在項目設置中將語言級別設置為19或20。否則,在編譯時會提示您無法使用預覽版本功能。虛擬線程是預覽版本的功能。zt628資訊網——每日最新資訊28at.com

zt628資訊網——每日最新資訊28at.com

1*6oGVASOHa2kRTtbZ--F7AQ.pngzt628資訊網——每日最新資訊28at.com

如果您使用的是JDK 21,請將語言級別設置為X - 實驗性功能。此外,由于JDK 21不是官方版本,您需要進入IDEA設置(請注意,這是IDEA設置,而不是項目設置),并手動將項目的目標字節碼版本更改為21。當前,最高選項為20,即JDK 20。將其設置為21后,您可以在JDK 21中使用這些功能。zt628資訊網——每日最新資訊28at.com

zt628資訊網——每日最新資訊28at.com

1*8ltpmMzUzE4u5CAGgNvIOg.pngzt628資訊網——每日最新資訊28at.com

1. 虛擬線程

現在我們如何啟動線程?zt628資訊網——每日最新資訊28at.com

首先,聲明一個線程類,實現Runnable接口,并實現run方法。zt628資訊網——每日最新資訊28at.com

public class SimpleThread implements Runnable {    @Override    public void run() {        System.out.println("name:" + Thread.currentThread().getName());        try {            Thread.sleep(1000);        } catch (InterruptedException e) {            throw new RuntimeException(e);        }    }}

然后,您可以使用這個線程類并啟動線程。zt628資訊網——每日最新資訊28at.com

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

擁有虛擬線程后,如何實現呢?zt628資訊網——每日最新資訊28at.com

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

以下是使用虛擬線程的幾種方式。zt628資訊網——每日最新資訊28at.com

(1) 直接啟動虛擬線程zt628資訊網——每日最新資訊28at.com

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

(2) 使用ofVirtual(),構建器模式啟動虛擬線程,您可以設置線程名稱、優先級、異常處理和其他配置zt628資訊網——每日最新資訊28at.com

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

或者:zt628資訊網——每日最新資訊28at.com

Thread thread = Thread.ofVirtual()      .name("thread-test")      .uncaughtExceptionHandler((t, e) -> {          System.out.println(t.getName() + e.getMessage());      })      .unstarted(new SimpleThread());thread.start();

(3) 使用工廠創建線程zt628資訊網——每日最新資訊28at.com

ThreadFactory factory = Thread.ofVirtual().factory();Thread thread = factory.newThread(new SimpleThread());thread.setName("thread-test");thread.start();

(4) 使用Executorszt628資訊網——每日最新資訊28at.com

ExecutorService executorService = Executors.newVirtualThreadPerTaskExecutor();Future<?> submit = executorService.submit(new SimpleThread());Object o = submit.get();

2. 結構化并發

想象以下情景。假設您有三個任務需要同時執行。只要任何一個任務完成并返回結果,就可以直接使用該結果,可以停止其他兩個任務。例如,一個天氣服務通過三個渠道獲取天氣情況,只要一個渠道返回即可。zt628資訊網——每日最新資訊28at.com

在這種情況下,在Java 8下應該做什么,當然也是可以的。zt628資訊網——每日最新資訊28at.com

List<Future<?>> futures = executor.invokeAll(tasks);String result = executor.invokeAny(tasks);

使用ExecutorService的invokeAll和invokeAny方法實現,但會有一些額外的工作。在獲取第一個結果后,您需要手動關閉另一個線程。zt628資訊網——每日最新資訊28at.com

在JDK 21中,可以使用結構化編程來實現。zt628資訊網——每日最新資訊28at.com

ShutdownOnSuccess捕獲第一個結果并關閉任務范圍以中斷未完成的線程并喚醒調用線程。zt628資訊網——每日最新資訊28at.com

一種情況是任何子任務的結果都可以直接使用,而無需等待其他未完成任務的結果。zt628資訊網——每日最新資訊28at.com

它定義了獲取第一個結果或在所有子任務失敗時拋出異常的方法。zt628資訊網——每日最新資訊28at.com

public static void main(String[] args) throws IOException {    try (var scope = new StructuredTaskScope.ShutdownOnSuccess()) {        Future<String> res1 = scope.fork(() -> runTask(1));        Future<String> res2 = scope.fork(() -> runTask(2));        Future<String> res3 = scope.fork(() -> runTask(3));        scope.join();        System.out.println("scope:" + scope.result());    } catch (ExecutionException | InterruptedException e) {        throw new RuntimeException(e);    }}public static String runTask(int i) throws InterruptedException {    Thread.sleep(1000);    long l = new Random().nextLong();    String s = String.valueOf(l);    System.out.println(i + "task:" + s);    return s;}

ShutdownOnFailurezt628資訊網——每日最新資訊28at.com

執行多個任務,只要有一個失敗(發生異常或引發其他活動異常),就停止其他未完成的任務,并使用scope.throwIfFailed來捕獲并拋出異常。zt628資訊網——每日最新資訊28at.com

如果所有任務都正常,可以使用Feture.get()或*Feture.resultNow()來獲取結果。zt628資訊網——每日最新資訊28at.com

public static void main(String[] args) throws IOException {    try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {        Future<String> res1 = scope.fork(() -> runTaskWithException(1));        Future<String> res2 = scope.fork(() -> runTaskWithException(2));        Future<String> res3 = scope.fork(() -> runTaskWithException(3));        scope.join();        scope.throwIfFailed(Exception::new);        String s = res1.resultNow();        System.out.println(s);        String result = Stream.of(res1, res2, res3)                             .map(Future::resultNow)                             .collect(Collectors.joining());        System.out.println("result:" + result);    } catch (Exception e) {        e.printStackTrace();    }}public static String runTaskWithException(int i) throws InterruptedException {    Thread.sleep(1000);    long l = new Random().nextLong(3);    if (l == 0) {        throw new InterruptedException();    }    String s = String.valueOf(l);    System.out.println(i + "task:" + s);    return s;}

3. 作用域值

我們一定使用過ThreadLocal,它是線程本地變量,只要線程不銷毀,就可以隨時獲取ThreadLocal中的變量值。作用域值也可以在線程內的任何時候獲取變量,但它有一個作用域的概念,當超出作用域時將被銷毀。zt628資訊網——每日最新資訊28at.com

public class ScopedValueExample {    final static ScopedValue<String> LoginUser = ScopedValue.newInstance();    public static void main(String[] args) throws InterruptedException {        ScopedValue.where(LoginUser, "Tom")                   .run(() -> {                       new Service().login();                   });        Thread.sleep(2000);    }    static class Service {        void login() {            System.out.println("user:" + LoginUser.get());        }    }}

上面的示例模擬了用戶登錄過程,使用ScopedValue.newInstance()聲明了一個ScopedValue,使用ScopedValue.where為ScopedValue設置了一個值,并使用run方法執行接下來要做的事情,以便在run()內部隨時獲取ScopedValue。在run方法中模擬了service的登錄方法,不需要傳遞參數LoginUser,直接通過LoginUser.get方法可以直接獲取當前登錄用戶的值。zt628資訊網——每日最新資訊28at.com

zt628資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-11874-0.html聊一聊Java 21,虛擬線程、結構化并發和作用域值

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

上一篇: 一文學會隊列入門:Python數據結構與算法

下一篇: 八個重構技巧使得Python代碼更Pythonic

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
欧美视频免费在线观看| 久久国产精品久久久| 亚洲精品国产日韩| 一本色道久久| 午夜影院日韩| 久久久久亚洲综合| 欧美电影打屁股sp| 欧美日本国产精品| 国产欧美三级| 亚洲第一狼人社区| 在线不卡欧美| 一区二区日韩免费看| 久久精品91久久久久久再现| 欧美成年人视频网站| 欧美午夜激情小视频| 国产综合久久久久久| 亚洲免费观看在线视频| 欧美伊人久久久久久午夜久久久久| 免费亚洲一区二区| 国产精品久久久久免费a∨| 黄色一区二区三区| 中文国产成人精品| 久久婷婷国产麻豆91天堂| 欧美天天综合网| 国内精品久久久久影院优| 一本一本a久久| 久久青草久久| 欧美午夜一区二区福利视频| 在线日韩欧美视频| 亚洲主播在线播放| 欧美xart系列高清| 国产乱码精品一区二区三| 免费毛片一区二区三区久久久| 欧美日韩中文| 在线观看亚洲a| 亚洲欧美日韩在线| 欧美大片va欧美在线播放| 国产欧美日韩激情| 一本色道久久综合亚洲精品小说| 久热精品视频在线观看| 国产精品青草久久| 亚洲精品乱码久久久久久蜜桃麻豆 | 欧美激情视频免费观看| 国产午夜一区二区三区| 亚洲天堂成人| 欧美精品v日韩精品v国产精品| 国产一区二区三区在线观看精品 | 亚洲一区二区三区视频播放| 蜜臀av一级做a爰片久久| 国产欧美日韩另类一区| 在线亚洲一区观看| 欧美激情亚洲| 在线观看日产精品| 久久狠狠亚洲综合| 国产精品一区二区久久精品| 一区二区三区日韩精品| 欧美激情亚洲| 亚洲国产免费| 美女91精品| 一区二区在线不卡| 久久精品欧洲| 国产一区二区三区久久 | 猛男gaygay欧美视频| 国内成人精品2018免费看 | 午夜精彩视频在线观看不卡| 欧美日韩在线直播| 亚洲美女啪啪| 欧美日本国产| 99精品99| 欧美日韩在线一区| 一区二区三欧美| 欧美日韩一区二区在线观看| 亚洲另类视频| 欧美绝品在线观看成人午夜影视| 亚洲经典一区| 欧美激情精品久久久久久大尺度 | 欧美激情一区三区| 亚洲人线精品午夜| 欧美国产激情| 日韩午夜电影在线观看| 欧美乱人伦中文字幕在线| 亚洲日本免费| 欧美精品亚洲二区| 一区二区不卡在线视频 午夜欧美不卡在 | 国产精品伊人日日| 亚洲欧美在线网| 国产日韩欧美成人| 久久精品国产视频| 伊人影院久久| 欧美二区不卡| 亚洲精品久久嫩草网站秘色| 欧美精品国产精品日韩精品| 亚洲免费电影在线| 欧美日韩三级一区二区| 一本久久综合亚洲鲁鲁五月天| 欧美日韩一区高清| 亚洲在线一区二区| 国产欧美一区二区精品忘忧草| 欧美在线观看日本一区| 国产一区视频在线观看免费| 久久婷婷综合激情| 亚洲国产专区| 欧美日韩精品福利| 午夜精品视频在线观看| 狠狠色2019综合网| 欧美粗暴jizz性欧美20| 中日韩美女免费视频网址在线观看 | 国产精品久久久久久久app| 欧美一级黄色录像| 在线观看91精品国产入口| 欧美激情女人20p| 亚洲小说区图片区| 国内激情久久| 欧美精品18+| 亚洲欧美综合v| 亚洲盗摄视频| 国产精品99免视看9| 久久精品在线播放| 亚洲免费观看高清在线观看 | 欧美性大战久久久久久久蜜臀| 欧美一级在线播放| 亚洲第一偷拍| 国产精品成人在线观看| 久久久久国产精品www| 亚洲免费电影在线观看| 国产欧美一区二区白浆黑人| 欧美a级一区| 亚洲综合精品一区二区| 在线播放中文字幕一区| 欧美视频在线看| 久久精品水蜜桃av综合天堂| 亚洲美女精品一区| 国产亚洲成精品久久| 欧美精品一区在线播放| 欧美一区=区| 亚洲久久成人| 国产亚洲一区二区三区| 欧美久久久久中文字幕| 欧美一区综合| 99亚洲伊人久久精品影院红桃| 国产午夜精品全部视频在线播放| 欧美国产一区二区在线观看| 欧美一级大片在线免费观看| 日韩视频精品在线观看| 国一区二区在线观看| 欧美色道久久88综合亚洲精品| 久久久久久久久久久成人| 亚洲私人影院| 亚洲国产影院| 国产婷婷色综合av蜜臀av| 欧美日韩精品欧美日韩精品| 久久久蜜桃精品| 亚洲综合另类| 亚洲日本激情| 激情成人亚洲| 国产乱码精品一区二区三区av| 欧美激情一区在线观看| 久久免费高清| 欧美亚洲三级| 亚洲深夜影院| 亚洲伦伦在线| 1024欧美极品| 国产亚洲高清视频| 国产精品成人aaaaa网站 | 亚洲人被黑人高潮完整版| 午夜国产精品视频| 欧美日韩免费高清| 在线欧美不卡| 久久精品视频网| 欧美日本亚洲韩国国产| 怡红院av一区二区三区| 久久久久久久久久久成人| 伊人久久大香线| 欧美成人午夜77777| 一二美女精品欧洲| 国产日产精品一区二区三区四区的观看方式 | 久久久国产91| 国产精品日日做人人爱| 宅男噜噜噜66一区二区| 国产精品劲爆视频| 欧美永久精品| 中文精品一区二区三区| 日韩午夜av在线| 亚洲小说春色综合另类电影| 国产精品红桃| 久久福利视频导航| 国产一区二区剧情av在线| 久久riav二区三区| 国内精品美女av在线播放| 久久久91精品国产一区二区三区| 亚洲电影免费| 国产欧美日韩麻豆91| 国产精品大片wwwwww| 欧美深夜影院| 欧美日韩理论| 欧美日韩亚洲一区二区三区在线| 欧美精品亚洲| 国产精品一区二区在线观看网站 | 国产一区二区三区在线观看免费| 国产精品porn| 欧美日韩精品免费在线观看视频 | 亚洲第一黄色| 亚洲日本欧美日韩高观看| 久久亚洲图片|