【发布时间】:2016-04-13 17:47:41
【问题描述】:
我有一个带有多个套接字的 Java 程序,偶尔会有需要读取和处理的数据,但是有一段不确定的时间没有要读取的数据。我需要一种好方法来不断检查套接字中是否有数据,并处理数据。为每个套接字分配一个线程并不是一个好主意,因为可能会有太多的套接字并使用太多的内存。
目前,我有几个线程,每个线程都分配给自己的套接字列表服务。如果任何套接字中都没有可读取的内容,则休眠一秒钟,然后循环。如果任何套接字中有要读取的内容,则无需等待即可循环并再次遍历套接字。
之所以这样做,是因为我不想在没有什么可读的情况下占用太多资源,一秒的延迟也不是问题。唯一的缺点是套接字没有灵活的跳转线程,所以最坏的情况是单个线程工作超载,而其他线程什么都不做。
我的另一个想法:创建一个线程池,并将所有要服务的套接字排队,并在服务时重新添加它们,但是没有好的方法可以知道是否没有套接字需要服务并且线程可以休息一下以释放 CPU 周期。
有没有一种分配线程任务的好方法,但又不会在无事可做的情况下使计算机资源过载?
理想情况下,每次套接字中有可用数据时都会触发一个事件,但据我所知,没有办法做到这一点,我必须轮询套接字。
重申一下,我不希望套接字和线程之间存在一对一的关系。
【问题讨论】:
-
你似乎在寻找Selectors。
标签: java multithreading