【发布时间】:2012-11-29 11:36:12
【问题描述】:
我是多线程编程的新手,我希望能够深入了解实现以下想法的最佳方法。
现在我的代码是这样工作的
它是单线程的,所以在处理每条数据并将其写入数据库所花费的时间里,新数据进来并排队,这太慢了。我在一个 4CPU 的服务器上运行,但是当前的设置只使用了 1 个。
我想将中间部分完成的工作与其余 3 个 CPU 分开。我将如何最好地做到这一点?我以为我可以为每条新数据创建一个新线程,但我们在一天的时间里谈论了数十万个新线程。根据我的阅读,与此相关的开销将非常大。内存对我来说是一个问题,所以如果创建所有这些线程会占用太多内存,我就会遇到麻烦。一个新线程是否会使用较不繁忙的 CPU,或者它会使用相同的 CPU,因为它是同一个 JVM?
每条新数据的处理和数据库写入不应超过几秒钟,如果那样的话。
我也在阅读有关线程池的文章,但这个想法让我有点困惑,我找不到一个很好的例子。
我在想这样的事情
请帮助多线程新手提出合理的设计!在此先感谢:-)
【问题讨论】:
-
这个问题对于 StackOverflow 来说可能有点过于开放了。您可能想在programmers.stackexchange.com 发帖。不过图片不错。
-
我会花时间阅读Java Concurrency,特别注意Executors 部分。虽然我同意邓肯的观点,但请为一个深思熟虑的问题 +1
-
我认为你的最后一张图片基本上是准确的。但是,您可能希望将处理过的数据传递给将它们写入数据库的其他线程,以便能够分别调整处理步骤和写入步骤的线程数。
-
听起来是一个可以通过使用生产者和消费者来解决的问题。此外,您可能希望使用某种与数据库的连接池来正确处理与数据库的连接。永远不要直接使用线程,有时最好在同一个线程中执行某些东西;创建线程的成本相对较高。
-
@Duncan - 谢谢,我以前没见过程序员 stackexchange。会在那里发帖。 Kristoffer 分离出数据库部分可能是有意义的,但它基本上将我引向同一个问题,即如何让线程等待某些操作。 MadProgrammer - 我会研究 Executors 类,也许这就是我需要的
标签: java multithreading threadpool