h.i*_*h.i 8 java multithreading pool pooling spawning
我正处于一个问题,我无法决定采取哪种解决方案.
这个问题有点独特.让我们这样说,我从网络连续接收数据(每秒2到4次).现在,每个数据都属于不同的组合.现在,让我们调用这些组,group1,group2等.
每个组都有一个专用的作业队列,来自网络的数据被过滤并添加到其相应的组进行处理.
起初我为每个组创建了一个专用线程,它将从作业队列中获取数据,处理它然后进入阻塞状态(使用链接阻塞队列).
但我的大四学生建议我应该使用线程池,因为这样线程不会被阻塞,并且可供其他组处理.
但事实上,数据即时获取的速度足够快,并且线程处理它的时间足够长,因此线程可能不会进入阻塞模式.这也将保证数据按顺序处理(作业1在作业2之前完成),这在汇集时可能不会发生.
我的大四学生也倾向于这样一个事实,即汇集也会为我们节省大量的内存,因为线程已经被淘汰了(我以为他真的想要这个词;)).虽然我不同意这个,因为,我个人认为,汇集与否每个线程都有自己的堆栈内存.除非线程池中有某些我不知道的东西.
最后一件事,我一直认为汇集有助于工作在短时间内出现大量工作.这是有道理的,因为线程生成会导致性能下降,因为初始化线程所花费的时间比执行作业所花费的时间多得多.所以汇集在这里有很多帮助.
但在我的情况下,group1,group2,...,groupN始终保持活着状态.因此,如果有数据,他们仍然会在那里.因此,线程产生不是问题所在.
我的大四学生不相信,并希望我采用汇集解决方案,因为它的内存占用很大.
那么,走哪条路呢?
谢谢.
好问题。正如您所说,池确实可以节省您的初始化时间。但它还有另一个方面:资源管理。在这里我问你这个问题——你有多少个组(读取专用线程)?它们在应用程序的执行期间动态增长吗?
例如,考虑这个问题的答案是肯定的情况。新的组类型是动态添加的。在这种情况下,您可能不想为每个线程分配一个线程,因为从技术上讲,对将创建的组的数量没有限制,您将创建大量线程,并且系统将进行上下文切换而不是执行实际工作。线程池的救援——线程池允许您指定对可能创建的最大线程数的限制,而不考虑负载。因此,应用程序可能会拒绝某些请求的服务,但通过的请求会得到正确处理,而不会严重耗尽系统资源。
考虑到上述情况,我很可能在您的情况下,为每个组拥有一个专用线程是非常可以的!
这同样适用于你的前辈相信它会节省内存。确实,一个线程占用了堆上的内存,但它真的有这么多吗?如果它是预定义的量,比如说5。甚至10 - 也可能没问题。不管怎样,你不应该使用池化,除非你是先验的并且绝对确信你确实有问题!
池化是一项设计决策,而不是架构决策。如果您在遇到性能问题后发现池化是有益的,则不能在开始时进行池化并继续优化。
考虑到请求的序列化(按顺序执行),无论您使用线程池还是专用线程。顺序执行是与单个处理程序线程耦合的队列的属性。