定义并行处理线程池计数和休眠时间

时间:2014-05-18 02:09:38

标签: java multithreading spring parallel-processing

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

要执行parallal处理,我计划使用Java executor框架。

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

  2. Thread.sleep(20)是一个好习惯,同时将这个大更新作为背景处理。

1 个答案:

答案 0 :(得分:0)

我对Spring处理的具体了解不多,但你的问题看起来很普遍,我仍然可以提供一个可能不充分的答案。

  1. 一般来说,有很多因素会影响你想要的线程数。你绝对不希望核心上有多个线程,因为当线程开始争夺CPU时间而不是工作时,这会减慢速度,所以你的核心数可能是你的上限,或核心数 - 1允许一个核心运行所有其他任务(所以在你的情况下可能是3或4个核心,顶部,如果我记得正确的i3处理器核心数)。但是,在这种情况下,我猜你更有可能遇到I / O和/或内存/缓存瓶颈,因为当涉及这些瓶颈时,这些更有可能减慢你的程序而不是并行化不足。此外,线程正在执行的任务会影响您可以使用的线程数;如果您有一个线程来提取数据,而一个线程在处理后将数据转储回来,那么这些线程可能会共享一个核心。
  2. 我不确定为什么这会是一个好主意...在处理过程中你对Thread.sleep()有什么用处?我猜它实际上减慢了你的处理速度,因为你正在做的就是让线程在它们正常工作时进入休眠状态。
  3. 在任何情况下,我都要小心并行化可能是I / O绑定任务的内容。您肯定需要剖析以查看瓶颈所在的位置,甚至在开始并行化之前,以确保多个核心实际上对您有所帮助。

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

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