【问题标题】: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
如何确定线程池数?
我认为这取决于硬件我的硬件。它是 16 GB Ram 和 Co-i 3 处理器。
Thread.sleep(20);同时将这个大更新作为后台处理是一个好习惯吗?
【问题讨论】:
标签:
java
multithreading
spring
parallel-processing
【解决方案1】:
我对 Spring 处理具体了解不多,但您的问题似乎很笼统,我仍然可以提供可能不充分的答案。
- 通常有很多因素会影响您想要多少线程。您绝对不希望一个核心上有多个线程,因为随着线程开始争用 CPU 时间而不是工作,这会减慢速度,因此您的核心数可能是您的上限,或者核心数 - 1 以允许一个核心让所有其他任务运行(所以在你的情况下,可能是 3 或 4 个核心,如果我记得 i3 处理器的核心数量正确的话)。但是,在这种情况下,我猜您更有可能遇到 I/O 和/或内存/缓存瓶颈,因为当涉及到这些瓶颈时,与并行化不足相比,这些更有可能减慢您的程序速度。此外,您的线程正在执行的任务会影响您可以使用的线程数;如果您有一个线程来拉入数据,一个线程在处理后将数据转储出来,那么这些线程可能会共享一个内核。
- 我不知道为什么这是个好主意...您在处理时看到
Thread.sleep() 有什么用处?我猜它实际上会减慢你的处理速度,因为你所做的只是让线程在它们可以工作时进入睡眠状态。
在任何情况下,我都会对并行化可能是 I/O 绑定的任务持谨慎态度。您肯定需要剖析以了解瓶颈在哪里,甚至在您开始并行化之前,以确保多核实际上会帮助您。
如果是 CPU 增加了额外的时间来完成您的任务,那么您可以开始并行化。即使这样,也要小心缓存问题;尝试确保每个线程都在完全独立的数据块上工作(例如通过ThreadLocal),因此缓存/内存问题不会限制任何性能提升。一种可行的方法是让阅读器线程将数据转储到Queue,然后工作线程可以将其读入ThreadLocal结构、进程等。
我希望这会有所帮助。我会不断更新,因为我确实犯了错误。