【发布时间】:2020-08-08 11:05:38
【问题描述】:
“一个 ForkJoinPool 是用给定的目标并行级别构造的;默认情况下,等于可用处理器的数量。”
假设我的 CPU 有 2 个内核。那么,ForkJoinPool 创建的最大线程数是 4?
假设我正在执行一个异步操作,该操作在使用默认 Forkpool 的循环(比如 10k)操作中返回一个未来对象...那么 Forkpool 将创建多少个线程?
List<ListenableFuture<SendResult<String, String>>> cf = new ArrayList<ListenableFuture<SendResult<String, String>>>();
future = kafkaTemplate.send(topicName, message);
cf.add(future);
i++;
future.addCallback(new ListenableFutureCallback<SendResult<String, String>>() {
@Override
public void onSuccess(SendResult<String, String> result) {
syso("sent success");
}
@Override
public void onFailure(Throwable ex) {
System.out.println(" sending failed");
}
});
而且,在其他课程中,我正在检查所有未来是否都已完成:
for (ListenableFuture<SendResult<String, String>> m : myFutures) {
m.get();
}
【问题讨论】:
-
你试过了吗?如果线程不可用,该任务将被添加到队列中,你能显示代码吗?
-
我已经添加了代码.....我正在向 Kakfa 异步发送消息(比如 10k 条消息)并等待未来完成。假设我所有的未来都处于待处理状态......那么将创建多少个线程?
-
你没有说你从哪里得到这些文档以及它们指的是什么,但你是在问这些文档是否正确?如果您有 2 个 CPU 内核,则将创建 2 个线程。这里的例外是英特尔超线程,操作系统将其视为附加处理器。所以根据你描述的行为,说
numThreads = numLogicalCores可能更准确 -
@ChristopherSchneider 我是从那里得到的。但我怀疑我是否正在执行一个异步操作,它会返回一个循环中的未来,如代码中所示,并且它使用默认的 FirkJoinPool 那么可以创建多少个最大线程ForkJoinPool..docs.oracle.com/javase/7/docs/api/java/util/concurrent/…
-
@Deadpool 我在回答中添加了一个示例。
标签: java asynchronous spring-kafka forkjoinpool