<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Java 的作用域值(Scoped Values)和結構化并發(Structured Concurrency)

      以下代碼在Java 24 preview測試通過

      不使用虛擬線程

      package org.example;
      
      import java.util.concurrent.*;
      
      public class ScopedValueWithVirtualThreads {
          void main() {
              final String THREAD_S_N = "%s read USER_ID = %s, Thread: %s%n";
              final ScopedValue<String> USER_ID = ScopedValue.newInstance();
              // 將 ScopedValue 綁定到當前線程作用域
              ScopedValue.where(USER_ID, "user-123").run(() -> {
                  try (var scope = new StructuredTaskScope.ShutdownOnFailure("Thread", Executors.defaultThreadFactory())) {
                      // 在子線程中讀取 ScopedValue(會繼承父線程的綁定)
                      var f1 = scope.fork(() -> String.format(THREAD_S_N, "Task1", USER_ID.get(), Thread.currentThread()));
                      var f2 = scope.fork(() -> String.format(THREAD_S_N, "Task2", USER_ID.get(), Thread.currentThread()));
      
                      scope.join();
                      scope.throwIfFailed();
      
                      System.out.printf(f1.get());
                      System.out.printf(f2.get());
                      System.out.printf(THREAD_S_N, "In-try", USER_ID.get(), Thread.currentThread());
                  } catch (InterruptedException | ExecutionException e) {
                      e.printStackTrace();
                  }
              });
          }
      }
      

      輸出結果:

      Task1 read USER_ID = user-123, Thread: Thread[#26,pool-1-thread-1,5,main]
      Task2 read USER_ID = user-123, Thread: Thread[#27,pool-1-thread-2,5,main]
      In-try read USER_ID = user-123, Thread: Thread[#3,main,5,main]

      使用虛擬線程

      package org.example;
      
      import java.util.concurrent.*;
      
      public class ScopedValueWithVirtualThreads {
          void main() {
              final String THREAD_S_N = "%s read USER_ID = %s, Thread: %s%n";
              final ScopedValue<String> USER_ID = ScopedValue.newInstance();
              // 將 ScopedValue 綁定到當前線程作用域
              ScopedValue.where(USER_ID, "user-123").run(() -> {
                  try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
                      // 在子線程中讀取 ScopedValue(會繼承父線程的綁定)
                      var f1 = scope.fork(() -> String.format(THREAD_S_N, "Task1", USER_ID.get(), Thread.currentThread()));
                      var f2 = scope.fork(() -> String.format(THREAD_S_N, "Task2", USER_ID.get(), Thread.currentThread()));
      
                      scope.join();
                      scope.throwIfFailed();
      
                      System.out.printf(f1.get());
                      System.out.printf(f2.get());
                      System.out.printf(THREAD_S_N, "In-try", USER_ID.get(), Thread.currentThread());
                  } catch (InterruptedException | ExecutionException e) {
                      e.printStackTrace();
                  }
              });
          }
      }
      

      輸出結果:

      Task1 read USER_ID = user-123, Thread: VirtualThread[#27]/runnable@ForkJoinPool-1-worker-1
      Task2 read USER_ID = user-123, Thread: VirtualThread[#29]/runnable@ForkJoinPool-1-worker-1
      In-try read USER_ID = user-123, Thread: Thread[#3,main,5,main]

      解釋

      • try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
        • 創建一個 結構化任務作用域 scope,策略是 ShutdownOnFailure。
        • 含義:如果任何一個子任務拋出異常,自動取消其他所有子任務。
        • 自動資源管理:scope.close() 會在 try 塊結束時被調用,做清理工作。
      • scope.fork(...),使用 scope.fork() 啟動一個新的子任務
      • scope.join();,等待所有子任務完成(不論成功還是失敗)。
        • 注意:這不會拋出異常,只是阻塞當前線程直到所有任務都完成。
      • scope.throwIfFailed();,如果有任何子任務拋出異常,就把它的異常重新拋出,其他任務已被取消。
        • ShutdownOnFailure 策略保證了只要有失敗,就立即停止其他任務的運行(或阻止它們開始)。

      什么是作用域值

      • 在父線程中使用 ScopedValue.where() 綁定了 USER_ID = "user-123";
      • 子線程是通過 StructuredTaskScope.fork() 啟動的,它們自動繼承了這個綁定;
      • 所以在 f1 和 f2 中訪問 USER_ID.get() 會得到 "user-123",不需要重新傳參;
      • 這種繼承是線程安全的、只讀的,不像 ThreadLocal 容易被污染或修改。
      posted @ 2025-07-06 20:19  又是火星人  閱讀(87)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国内精品久久人妻无码不卡| 男女做aj视频免费的网站| 亚洲欧美电影在线一区二区| 强奷乱码中文字幕| A级毛片无码久久精品免费| 黄色免费在线网址| 男女爽爽无遮挡午夜视频| 日本亚洲欧洲无免费码在线| 55大东北熟女啪啪嗷嗷叫| 大尺度国产一区二区视频| 粗壮挺进人妻水蜜桃成熟| 99国产精品白浆无码流出| 亚洲人成电影网站 久久影视| 磐石市| 丰满人妻一区二区三区色| 日本东京热一区二区三区| 久久精品国产一区二区蜜芽| 午夜视频免费试看| 日韩精品久久不卡中文字幕| 人妻系列无码专区久久五月天| 久久夜色精品国产亚洲av| 久久99国产精品尤物| 国产午精品午夜福利757视频播放| 人妻少妇88久久中文字幕| 无码国产69精品久久久久网站| 99国产午夜福利在线观看| 国产精品乱子乱xxxx| 国产精品一区二区三区色| 无码国内精品久久人妻蜜桃| 99久久精品国产一区二区蜜芽| 亚欧美闷骚院| 日韩精品区一区二区三vr| 亚洲高清aⅴ日本欧美视频| 无码人妻精品一区二区三| 四虎国产精品成人免费久久 | 亚洲av伦理一区二区| 国产suv精品一区二区883| 久久国内精品自在自线观看| 国产精品天干天干综合网| 性欧美VIDEOFREE高清大喷水| 人妻中文字幕av资源站|