Java21虚拟线程最佳实践

576 阅读1分钟

虚拟线程标准用法及场景

    void handle(Request request, Response response) {
        var url1 = ...
        var url2 = ...

        try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
            var future1 = executor.submit(() -> fetchURL(url1));
            var future2 = executor.submit(() -> fetchURL(url2));
            response.send(future1.get() + future2.get());
        } catch (ExecutionException | InterruptedException e) {
            response.fail(e);
        }
    }

    String fetchURL(URL url) throws IOException {
        try (var in = url.openStream()) {
            return new String(in.readAllBytes(), StandardCharsets.UTF_8);
        }
    }

url1 和 url1 的处理原来是串行的,虚拟线程改为并行

目标

  • 使以简单的thread-per-request风格编写的服务器应用程序能够以接近最佳的硬件利用率进行扩展。
  • 使使用 java.lang.Thread API 的现有代码能够以最小的更改采用虚拟线程。
  • 使用现有 JDK 工具轻松进行虚拟线程故障排除、调试和分析。

非目标

  • 删除传统的线程实现或默默地迁移现有应用程序以使用虚拟线程并不是目标。
  • 改变Java的基本并发模型并不是目标。
  • 在 Java 语言或 Java 库中提供新的数据并行结构并不是我们的目标。 Stream API 仍然是并行处理大型数据集的首选方式。

参考文档:openjdk.org/jeps/444