【问题标题】:How to avoid tight thread loop?如何避免紧线环?
【发布时间】:2016-04-13 17:47:41
【问题描述】:

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

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

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

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

有没有一种分配线程任务的好方法,但又不会在无事可做的情况下使计算机资源过载?

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

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

【问题讨论】:

标签: java multithreading


【解决方案1】:

可能有太多的套接字并使用了太多的内存。

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

我有几个线程,每个线程都分配给它自己的套接字列表服务。如果任何套接字中都没有可读取的内容,则休眠一秒钟,然后循环。

我使用了一个暂停,它会在很短的时间内忙碌等待,然后退出并最终休眠一段时间。

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

唯一的缺点是socket没有灵活的跳转线程,所以最坏的情况是单个线程工作超载,而其他线程什么都不做。

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

我必须轮询套接字。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    • 2020-10-11
    • 2019-05-01
    相关资源
    最近更新 更多