【问题标题】:FixedThreadPool not executing properly固定线程池未正确执行
【发布时间】:2016-07-20 12:48:26
【问题描述】:

我创建了大小为 100 的 newFixedThreadPool 并在其上启动了 500 个线程。 所有线程都已正确启动,并且都需要足够的时间。但是随后执行程序只是关闭了一些线程产生的输出,而其中大多数没有。 我也用最大值调用了 shutdown() 和 awaitTermination() ,因此它必须等到所有线程都完成。 当任务数量很少(例如 20 或 30)且池大小与 100 相同时,这可以正常工作。 线程中的逻辑是对列表进行操作并将该列表转换为 xlsx 文件。 如果有人遇到类似问题,请分享任何信息。

【问题讨论】:

    标签: java threadpoolexecutor


    【解决方案1】:

    向 ExecutorService 提交任务的一个常见错误是忽略发生的任何错误。你必须要么;

    • .submit(task) 返回的每个 Future 上调用 Future.get() 以查看任何错误或
    • 您必须在 try { } catch (Throwable t) 块中捕获并记录所有错误。

    很可能发生错误,导致所有任务失败。

    顺便说一句,如果您有 CPU 密集型任务,最佳线程数可能是您拥有的 CPU 数。

    thread中的逻辑是对list进行操作并转换

    一个更简单的方法可能是使用 parallelStream 例如

    listToProcess.parallelStream()
                 .map(l -> process(l))
                 .forEach(row -> save(row));
    

    【讨论】:

    • 是的,我做了 future.get() ,仍然面临同样的问题,我还在各个线程中记录了所有异常(实际上没有)。我将尝试使用 thareds = CPU 数量,但不确定我是否在执行 CPU 绑定任务。
    猜你喜欢
    • 2015-06-26
    • 2022-01-18
    • 2014-08-07
    • 1970-01-01
    • 2015-02-28
    • 2017-12-07
    • 2016-12-10
    • 2014-08-27
    • 2017-12-29
    相关资源
    最近更新 更多