Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 这两种多线程布局中哪一种更好?_Java_Multithreading - Fatal编程技术网

Java 这两种多线程布局中哪一种更好?

Java 这两种多线程布局中哪一种更好?,java,multithreading,Java,Multithreading,我有一个多线程布局,其中有一个manager对象和许多workers对象 我怀疑哪种布局更适合使用: 1-工人们循环运行,向经理要求一份“新工作” 完成后不断地 或 2-工人完成每项工作后,经理会给他们新的工作 工作 对此有什么建议吗?原则上它们并没有什么不同。我认为这实际上取决于你如何去实现这两件事的逻辑。我可以看出,这比你最终要做的事情更重要 第二部分的关键是,经理需要知道员工是否完成了工作。因此,在这一点上,工人们仍然需要告诉经理,这与要求一份新工作几乎是一样的 我认为这实际上取决于你打算

我有一个多线程布局,其中有一个manager对象和许多workers对象

我怀疑哪种布局更适合使用:

1-工人们循环运行,向经理要求一份“新工作” 完成后不断地

2-工人完成每项工作后,经理会给他们新的工作 工作


对此有什么建议吗?

原则上它们并没有什么不同。我认为这实际上取决于你如何去实现这两件事的逻辑。我可以看出,这比你最终要做的事情更重要

第二部分的关键是,经理需要知道员工是否完成了工作。因此,在这一点上,工人们仍然需要告诉经理,这与要求一份新工作几乎是一样的


我认为这实际上取决于你打算怎么做。从理论上讲,我认为第二个是更好的选择,但这取决于你如何优雅地让它工作。

我会使用一个。经理将作业以循环的方式添加到队列中,工人从队列中获取作业并以循环的方式进行操作。

这是一个我已经反复思考过的问题。每一次我都选择了我要编码的特定情况。你也应该这样做

然而,要正确选择,您必须仔细研究这两种方法

考虑一个测试用例

您有数千个文件要处理


1.工人们控制着局面。
管理器
成为要处理的所有文件的队列。您可以创建一个固定数量的
worker
线程,这些线程从管理器请求下一个文件,并重复执行,直到列表用尽为止

后果 您通常不得不
同步
对队列的访问

您可以调整工作人员的数量,以实现硬件体系结构的最大吞吐量

有时,您可以根据当前负载动态调整工作人员的数量,但这可能很棘手。如果成功,您通常可以获得一个异常最优的解决方案


2.经理控制着局面。
管理器
为每个文件创建一个新的
可调用的
,并将其添加到
执行器
受控线程池中

后果 嗯。。。如果你仔细想想,也差不多。唯一的区别实际上是执行者在排队

所需的同步更少(当然,
执行器内部的同步除外)

动态调整线程的数量并不是一件小事,但我希望可以将
执行器子类化来实现这一点


总之

这两种体系结构几乎相同。多个线程并行处理一系列项

差异更多地体现在动态和足迹上

当工人处于控制状态时,任何时候都存在已知数量的对象。可以建立一个广泛的队列,但这些可能是小对象。工作是以固定且可预测的速度完成的。如果工作开始堆积起来,你必须做出特别的努力来处理它

当管理者处于控制之下时,可能会有大量的工人,他们中的大多数只是坐在那里等待执行者。本质上,执行者成为管理者,线程池容纳工人


我个人更喜欢由工人来控制。我想主要是因为考虑到两种基本相似的体系结构,我通常更喜欢具有最可预测的占地面积的体系结构。我计划进行试验。

建议使用executor服务,并让Java向工作者分配任务。:-)您的问题是使用哪种服务?我更喜欢第二种选择。我不知道它是否更快,但它更灵活,更容易更新,更容易理解。