我需要在JBOSS服务器正在启动的情况下更新表中的550 000条记录。我需要使用多线程和并行处理将此更新作为后台进程。应用程序是Spring,所以我可以使用初始化bean。
要执行parallal处理,我计划使用Java executor框架。
ThreadPoolExecutor executor=(ThreadPoolExecutor)Executors.newFixedThreadPool(50); G
如何确定线程池数? 我认为这取决于硬件我的硬件。它是16 GB Ram和Co-i 3处理器。
Thread.sleep(20)是一个好习惯,同时将这个大更新作为背景处理。
答案 0 :(得分:0)
我对Spring处理的具体了解不多,但你的问题看起来很普遍,我仍然可以提供一个可能不充分的答案。
Thread.sleep()
有什么用处?我猜它实际上减慢了你的处理速度,因为你正在做的就是让线程在它们正常工作时进入休眠状态。在任何情况下,我都要小心并行化可能是I / O绑定任务的内容。您肯定需要剖析以查看瓶颈所在的位置,甚至在开始并行化之前,以确保多个核心实际上对您有所帮助。
如果是CPU增加了额外的时间来完成任务,那么就可以开始并行化了。即使这样,也要小心缓存问题;尝试确保每个线程在完全独立的数据块上工作(例如通过ThreadLocal
),因此缓存/内存问题不会限制任何性能提升。一种可行的方法是让读者线程将数据转储到Queue
中,然后工作者线程可以读入ThreadLocal
结构,进程等。
我希望这有帮助。我会不断更新,因为我确实指出了错误。