java - 这两种多线程布局哪个更好?

标签 java multithreading

我有一个多线程布局,其中有一个管理器对象和很多工作人员对象。

我不确定哪种布局更好:

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/

相关文章:

Java:如何限制可以传递给方法的参数值

java - 将多个面板放入 JFrame 时出现问题

C线程池效率

Java - 使用 For 循环创建多线程

c++ - 使用来自matlab的boost::threads时挂起和/或segfault,而不是直接调用时

java - 使用 Guava 更改大型二维数组的索引

java - JNA映射以将输入/输出缓冲区传递给winapi函数

java - 在 gwt 中提示用户退格键和浏览器后退按钮

c++ - 如何在 x86 程序集中将当前线程的堆栈指针更改为新线程

java - Java 线程转储中缺少线程