Skip to content

启用虚拟线程

概述

启用虚拟线程选项要求当前JDK版本为JDK21+。启用此选项之后,HTTP客户端的sendAsyncenqueue系列方法会基于VirtualThreadPool提供的工作线程执行HTTP调用。

启用选项

创建HTTP客户端时把HttpOptions.HTTP_THREAD_POOL的值定义为virtual即可。例如:

java
HttpClient httpClient = Solpic.newHttpClientBuilder()
        .option(HttpOptions.HTTP_THREAD_POOL, "virtual")
        .build();

可以根据当前Java运行时版本进行动态判断和配置。例如:

java
Solpic.HttpClientBuilder builder = Solpic.newHttpClientBuilder();
// PlatformUtils是Solpic的一个工具类
if (PlatformUtils.X.getMajorVersion() >= 21) {
    builder.option(HttpOptions.HTTP_THREAD_POOL, "virtual");
}
HttpClient httpClient = builder.build();

验证

把日志级别调整为DEBUG并且进行异步HTTP调用。示例代码:

java
public static void main(String[] args) throws Exception {
    HttpClient httpClient = Solpic.newHttpClientBuilder()
            .option(HttpOptions.HTTP_THREAD_POOL, "virtual")
            .build();
    HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://httpbin.org/get"))
            .method(HttpMethod.GET)
            .build();
    CompletableFuture<HttpResponse<String>> f = httpClient.sendAsync(request, PayloadSubscribers.X.ofString());
    HttpResponse<String> response = f.get();
    int statusCode = response.getStatusCode().value();
    String responseBody = response.getPayload();
    System.out.println(statusCode);
    System.out.println(responseBody);
}

某次调用输出日志:

shell
[2024-08-29 16:20:54,508] [DEBUG] cn.vlts.solpic.core.http.client.jhc.JdkHttpClientImpl [virtual-31] - [JdkHttpClientImpl-1]
- Prepare to send HTTP request, method: GET, uri: https://httpbin.org/get
[2024-08-29 16:20:56,406] [DEBUG] cn.vlts.solpic.core.http.client.jhc.JdkHttpClientImpl [virtual-31] - [JdkHttpClientImpl-1]
- Receive HTTP response, method: GET, uri: https://httpbin.org/get, status: 200

TIP

注意日志输出格式中需要打印线程名称才能观察到'virtual-n',例如在logback中使用占位符[%thread]输出线程名称。

贡献者

页面历史

Released under the MIT License.