【问题标题】:Define Parallel Processing Thread Pool Count and Sleep time定义并行处理线程池计数和休眠时间
【发布时间】:2025-12-28 10:05:11
【问题描述】:

我需要在 JBOSS 服务器正在启动的情况下更新表中的 550 000 条记录。我需要将此更新作为具有多线程和并行处理的后台进程。应用程序是 Spring,所以我可以为此使用初始化 bean。

为了执行并行处理,我计划使用 Java 执行器框架。

ThreadPoolExecutor executor=(ThreadPoolExecutor)Executors.newFixedThreadPool(50); G
  1. 如何确定线程池数? 我认为这取决于硬件我的硬件。它是 16 GB Ram 和 Co-i 3 处理器。

  2. Thread.sleep(20);同时将这个大更新作为后台处理是一个好习惯吗?

【问题讨论】:

    标签: java multithreading spring parallel-processing


    【解决方案1】:

    我对 Spring 处理具体了解不多,但您的问题似乎很笼统,我仍然可以提供可能不充分的答案。

    1. 通常有很多因素会影响您想要多少线程。您绝对不希望一个核心上有多个线程,因为随着线程开始争用 CPU 时间而不是工作,这会减慢速度,因此您的核心数可能是您的上限,或者核心数 - 1 以允许一个核心让所有其他任务运行(所以在你的情况下,可能是 3 或 4 个核心,如果我记得 i3 处理器的核心数量正确的话)。但是,在这种情况下,我猜您更有可能遇到 I/O 和/或内存/缓存瓶颈,因为当涉及到这些瓶颈时,与并行化不足相比,这些更有可能减慢您的程序速度。此外,您的线程正在执行的任务会影响您可以使用的线程数;如果您有一个线程来拉入数据,一个线程在处理后将数据转储出来,那么这些线程可能会共享一个内核。
    2. 我不知道为什么这是个好主意...您在处理时看到Thread.sleep() 有什么用处?我猜它实际上会减慢你的处理速度,因为你所做的只是让线程在它们可以工作时进入睡眠状态。

    在任何情况下,我都会对并行化可能是 I/O 绑定的任务持谨慎态度。您肯定需要剖析以了解瓶颈在哪里,甚至在您开始并行化之前,以确保多核实际上会帮助您。

    如果是 CPU 增加了额外的时间来完成您的任务,那么您可以开始并行化。即使这样,也要小心缓存问题;尝试确保每个线程都在完全独立的数据块上工作(例如通过ThreadLocal),因此缓存/内存问题不会限制任何性能提升。一种可行的方法是让阅读器线程将数据转储到Queue,然后工作线程可以将其读入ThreadLocal结构、进程等。

    我希望这会有所帮助。我会不断更新,因为我确实犯了错误。

    【讨论】: