java - 线程池与许多单独的线程

标签 java multithreading pool pooling spawning

我正处于无法决定采用哪种解决方案的问题之中。

这个问题有点独特。让我们这样说吧,我不断地从网络接收数据(每秒 2 到 4 次)。现在每个数据都属于不同的组。 现在,我们称这些组为 group1、group2 等等。

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

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

但是我的前辈建议我应该使用线程池,因为这样线程就不会被阻塞,并且可以被其他组用来处理。

但事情是这样的,我获取的数据足够快,并且线程处理它所花费的时间足够长,线程可能不会进入阻塞模式。这也将保证数据得到顺序处理(作业 1 在作业 2 之前完成),这在池化中很少发生,也可能不会发生。

我的学长也认为池化也可以为我们节省大量内存,因为线程是池化的(我认为他真的用了这个词;))。虽然我不同意这一点,因为我个人认为,无论是否合并,每个线程都有自己的堆栈内存。除非线程池中有我不知道的东西。

最后一件事,我一直认为合并有助于在短时间内出现大量工作。这是有道理的,因为线程生成会降低性能,因为初始化线程所花费的时间比完成这项工作所花费的时间要多得多。所以汇集在这里有很大帮助。

但在我的例子中,group1、group2、...、groupN 始终保持 Activity 状态。因此,无论是否有数据,它们仍将存在。所以线程生成不是这里的问题。

我的前辈不相信并希望我使用池解决方案,因为它的内存占用量很大。

那么,该走哪条路呢?

谢谢。

最佳答案

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

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

考虑到以上情况,我很可能在你的情况下,有一个专门的 每个组的线程!

同理你学长坚信会节省内存。。确实,一个线程在堆上占用内存,但是真的有那么多吗,如果是预定义的数量,比如说5。甚至10-它是可能还行。无论如何,你不应该使用池,除非你是一个先验者并且绝对相信你确实有问题!

池化是一种设计决策,而不是架构决策。您不能在开始时不合并并继续优化,以防您在遇到性能问题后发现合并是有益的。

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

关于java - 线程池与许多单独的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11700763/

相关文章:

java - 阻塞的java线程的方法可以被另一个线程执行吗?

c# - 为什么 GetThreadTimes 返回

java - 资源已关闭但 sonarlint 仍显示资源未关闭

java - 观察者模式无限循环

java - 按下的按键相当于键入的按键

python - 为什么map_async()不需要pool.close()和pool.join()?

python - 为什么 pool.map() 和 map() 返回不同的结果?

java - Apache FTPServer——限制像 'DELE' 这样的命令

python - 使用 sys.exit() 终止 python 线程

javascript - 如何使用 getconnection 方法创建 Node js MySQL 池