我创建了大小为100的newFixedThreadPool并在其上启动了500个线程。 所有线程都正确启动,所有线程都需要花费足够的时间。但是然后执行器只是关闭了一些线程产生的输出,而其中大多数没有。 我已经使用max值调用了shutdown()和awaitTermination(),因此必须等到所有线程都完成。 当任务数量较少(如20或30,相同的池大小为100)时,此方法可以正常工作。 线程中的逻辑是在列表上操作并将该列表转换为xlsx文件。 如果有人遇到类似问题,请分享任何信息。
答案 0 :(得分:1)
向ExecutorService提交任务的一个常见错误是忽略发生的任何错误。你必须要么;
.submit(task)
返回的每个Future上调用Future.get()以查看任何错误或try { } catch (Throwable t)
块中的所有错误。很可能发生错误,导致所有任务失败。
BTW如果您有CPU绑定任务,最佳线程数可能是您拥有的CPU数。
线程中的逻辑是在列表上操作并转换
更简单的方法可能是使用parallelStream,例如
listToProcess.parallelStream()
.map(l -> process(l))
.forEach(row -> save(row));