线程池与许多单独的线程

时间:2012-07-28 11:50:38

标签: java multithreading pool pooling spawning

我正处于一个问题中,我无法决定采取哪种解决方案。

这个问题有点独特。让我们这样说,我从网络连续接收数据(每秒2到4次)。现在,每个数据都属于不同的组合。 现在,我们可以调用这些组,group1,group2等。

每个组都有一个专用的作业队列,来自网络的数据被过滤并添加到相应的组中进行处理。

首先,我为每个组创建了一个专用线程,它将从作业队列中获取数据,处理它然后进入阻塞状态(使用链接阻塞队列)。

但是我的大四学生建议我应该使用线程池,因为这样线程不会被阻塞,并且可以被其他组用于处理。

但事情就是这样,数据即时获取足够快,线程处理它的时间足够长,线程可能不会进入阻塞模式。这也将保证数据按顺序处理(作业1在作业2之前完成),这在汇集时可能不会发生。

我的大四学生也倾向于这样一个事实,即汇集也会为我们节省大量的内存,因为线程已经被淘汰了(我以为他真的想要这个词;))。虽然我不同意这个,因为,我个人认为,汇集与否每个线程都有自己的堆栈内存。除非线程池中有某些我不知道的东西。

最后一件事,我一直认为汇集可以帮助工作在短时间内出现大量工作。这是有道理的,因为线程生成会导致性能下降,因为初始化线程所花费的时间比执行作业所花费的时间多得多。所以汇集在这里有很多帮助。

但在我的情况下,group1,group2,...,groupN始终保持活着状态。因此,如果有数据,他们仍然会在那里。因此,线程产生不是问题所在。

我的大四学生并不相信,并希望我选择合并解决方案,因为它的内存占用很大。

那么,采取哪条路径?

谢谢。

2 个答案:

答案 0 :(得分:4)

创建线程将消耗资源,包括每个线程的默认堆栈(IIR 512Kb,但可配置)。因此,汇集的优势在于您会受到有限的资源冲击。当然,您需要根据您必须执行的工作来调整池的大小。

对于您的特定问题,我认为关键是在每个场景中实际测量性能/线程使用等。除非你遇到限制,否则我也许不会担心,除了确保你可以将一个实现交换到另一个实现而不会对你的应用程序产生重大影响。请记住,过早优化是所有邪恶的根源Note that

  

“过早优化”是用于描述情况的短语   程序员让性能考虑因素影响设计   一段代码。这可能导致设计不那么干净   因为它可能是或代码不正确,因为代码是   由于优化而复杂化,程序员分心了   优化

答案 1 :(得分:2)

好问题。 正如你所说,池确实可以节省你的初始化时间。但它有另一个方面:资源管理。在这里,我问你这个 - 你有多少组(读专用线程)? 它们是否在应用程序的执行期间动态增长?

例如,考虑一下这个问题的答案是肯定的情况。新的组类型是动态添加的。在这种情况下,您可能不希望将aa线程专用于每个线程,因为在技术上没有限制将要创建的组的数量,您将创建大量线程并且系统将是上下文切换而不是执行实际工作。 线程池到救援线程池允许您指定对可能可能创建的最大线程数的限制,而不考虑负载。因此,应用程序可能会拒绝来自某些请求的服务,但是那些通过的服务会得到妥善处理,而不会严重耗尽系统资源。

考虑到上述情况,我很有可能在你的情况下,有一个专门的非常好 每个小组的主题!

同样适用于你的大四学生的信念,即它会节省内存..的确,一个线程占用了堆上的内存,但实际上是非常多,如果它是一个预定义的数量,比如说5.甚至10-它是可能没关系。无论如何,你不应该使用汇集,除非你是一个小修道院,并且绝对相信你确实有问题!

池化是一项设计决策,而非建筑决策。如果您在遇到性能问题后发现池是有益的,则无法在开始时进行池化并继续进行优化。

考虑到请求的序列化(按顺序执行),无论您使用的是线程池还是专用线程。顺序执行是队列的一个属性,与单个处理程序线程相结合。