线程池有个疑问,我的机器 4 核 16G,按照最优的线程数 2n+1 来说为 9 个,但是在如下代码中
public static void main(String[] args) {
// 创建线程池,500 个线程数
ExecutorService es = ThreadUtils.getInstance("approveProcessForBatch", 500);
Map<Integer, Future<Object>> futureMap = new HashMap<>(SystemConstant.INITIAL_CAPACITY);
for (int i = 0; i <= 250; i++) {
// delay5s 耗时 5s
es.submit(() -> delay5s(""));
}
System.out.println("开始执行时间:" + DateTime.now());
for (int i = 0; i <= 100; i++) {
int finalI = i;
Future<Object> future = es.submit(() -> delay5s("当前任务" + finalI));
futureMap.put(finalI, future);
}
futureMap.keySet().forEach(i -> {
try {
// v 是当前任务名称
Object v = futureMap.get(i).get();
System.out.println(v + ",完成时间:" + DateTime.now());
} catch (ExecutionException | InterruptedException e) {
throw new BusinessException(e);
}
});
}
目前设置了 500 个线程数,会在 5s 之后将 100 个任务全部完成,假如我只设置 9 个,那预计需要 250/9 * 5s 的时间,导致这个现象的原因是啥?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.