gpt4 book ai didi

java - 如何避免线环过紧?

转载 作者:行者123 更新时间:2023-11-30 07:27:33 25 4
gpt4 key购买 nike

我有一个带有多个套接字的Java程序,偶尔有需要读取和处理的数据,但有一段不确定的时间没有数据可供读取。我需要一种好方法来不断检查套接字中是否有数据,并处理数据。为每个套接字分配一个线程并不是一个好主意,因为可能会有太多套接字并使用太多内存。

目前,我有几个线程,每个线程都分配给自己的套接字列表提供服务。如果任何套接字中没有任何内容可读取,则 hibernate 一秒钟,然后循环。如果任何套接字中有需要读取的内容,则无需等待即可循环并再次遍历套接字。

我这样做的原因是因为我不想在没有什么可读的情况下占用太多资源,而且一秒的延迟不是问题。唯一的缺点是套接字没有跳转线程的灵 active ,因此最坏的情况是单个线程工作重载,而其他线程什么都不做。

我的另一个想法是:创建一个线程池,并将所有要服务的套接字排队,并在服务时重新添加它们,但是没有好方法来知道是否没有套接字需要服务并且线程可以休息一下以释放 CPU 周期。

有没有一种好方法可以分配线程任务,但又不会在无事可做时使计算机资源重载?

理想情况下,每次套接字中有可用数据时都会触发一个事件,但据我所知,没有办法做到这一点,我必须轮询套接字。

重申一下,我不希望套接字和线程之间存在一对一的关系。

最佳答案

there could be too many sockets and use too much memory.

通过这种方式,您可以达到 1,000 到 10,000。内存比 12 年前 NIO 推出时便宜得多,而且线程比以前更加高效和可扩展。

I have a couple threads, each one assigned to service its own list of sockets. If there was nothing to read in any of the sockets, then sleep one second, then loop.

我使用暂停,它会忙等待一小段时间并产生,最后 hibernate 一段逐渐增加的时间。

您可以使用选择器,但正确使用它们并不简单。在这种情况下,我会使用像 netty 这样的库,或者至少阅读它使用的代码。

The only down side is that there is no flexibility for sockets to jump threads, so the worst case scenario is that a single thread is overloaded with work, while the other threads are doing nothing.

这是每个套接字使用一个线程更好的地方。

I must poll the sockets.

您可以使用选择器,但它们是单线程的,并且选择器之间的切换套接字并不简单。

为了简单起见,我会重新考虑使用更多线程。

关于java - 如何避免线环过紧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36605884/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com