1.创建线程池
final ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) Executors.newFixedThreadPool(5);
2.创建 http 请求
var builder = HttpRequest.newBuilder()
.uri(URI.create(uri));
HttpRequest request =
builder.POST(HttpRequest.BodyPublishers.ofString(body, StandardCharsets.UTF_8)).build();
//发送请求
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
3.创建任务,丢给线程池
List<CompletableFuture<?>> futures = new ArrayList<>();
for (User user : Users) {
CompletableFuture<?> future = CompletableFuture.runAsync(() -> {
用上面的 http 请求
}, threadPoolExecutor);
futures.add(future);
}
//等待所有任务完成
final int taskCount = futures.size();
CompletableFuture<?> allFuture = CompletableFuture.allOf((futures.toArray(new CompletableFuture[taskCount])));
allFuture.join();
//关闭线程池
threadPoolExecutor.shutdown();
4.User 数是 2000 多,也就是任务数才 2000 多,就把我系统资源爆了,提示不能再继续创建 thread 了,我的 macOS 直接黑屏重启
我寻思我创建的线程池才 5 个,不至于让我的系统挂了吧?那元凶可能是 http 新的 client api 自己再私自创建大量线程,直到耗尽系统的线程资源数?有无大佬指教一下怎么优化?我就想我请求只限制在 5 个线程以内
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.