我有一个多线程布局,其中有一个管理器对象和很多工作人员对象。
我不确定哪种布局更好:
1 - The workers run in a loop and ask for a "new job" to the manager constantly after finished.
或
2 - The manager give new jobs to the workers after they finish each job.
对此有什么建议吗?
最佳答案
这个问题我曾经思考过很多次。每次我都会根据我正在编码的具体情况进行选择。你也应该这样做。
但是,要正确选择,您必须仔细研究这两种方法。
考虑一个测试用例。
<小时/>You have thousands of files to process.
1。 worker 们掌控一切。
管理器
成为所有要处理的文件的队列。您创建固定数量的工作
线程,这些线程向管理器请求下一个文件并重复,直到列表耗尽。
后果
您通常最终必须同步
对队列的访问。
您可以调整工作线程的数量,以获得硬件架构的最大吞吐量。
有时您可以根据当前负载动态调整工作人员数量,但这可能很棘手。如果成功,您通常可以获得异常最佳的解决方案。
<小时/>2。经理处于控制之中。
manager
为每个文件创建一个新的 Callable
并将其添加到 Executor
控制的线程池中。
后果
嗯...如果你仔细想想,就差不多了。唯一的区别实际上是执行器进行排队。
所需的同步较少(当然除了执行器
内部)。
动态调整线程数并非易事,但我希望可以对 Executor
进行子类化来实现这一目标。
总结
这两种架构非常相似。许多线程并行处理一系列项目。
差异更多在于动态和足迹。
当工作人员处于控制状态时,任何时候都会出现已知数量的物体。可以建立一个广泛的队列,但这些可能是小对象。工作以固定且可预测的速度完成。如果工作开始堆积,你就必须付出特别的努力来处理它。
当管理者控制时,工作人员可能会激增,其中大多数只是坐着等待执行者。本质上,执行器成为管理器,线程池容纳工作器。
我个人更喜欢让 worker 掌控。我想主要是因为考虑到两种本质上相似的架构,我通常更喜欢具有最可预测足迹的架构。我打算尝试一下。
关于java - 这两种多线程布局哪个更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9612069/