Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何避免紧线圈?_Java_Multithreading - Fatal编程技术网

Java 如何避免紧线圈?

Java 如何避免紧线圈?,java,multithreading,Java,Multithreading,我有一个带有多个套接字的Java程序,偶尔会有需要读取和处理的数据,但是有一段不确定的时间,没有数据要读取。我需要一种好方法来不断检查套接字中是否有数据,并处理数据。为每个套接字分配一个线程不是一个好主意,因为可能有太多的套接字并使用太多内存 目前,我有两个线程,每个线程都被分配为自己的套接字列表提供服务。如果任何套接字中都没有可读取的内容,则先休眠一秒钟,然后循环。如果在任何套接字中都有要读取的内容,只需在不等待的情况下循环并再次遍历套接字 我这样做的原因是,如果没有什么可读的,我不想占用太多

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

目前,我有两个线程,每个线程都被分配为自己的套接字列表提供服务。如果任何套接字中都没有可读取的内容,则先休眠一秒钟,然后循环。如果在任何套接字中都有要读取的内容,只需在不等待的情况下循环并再次遍历套接字

我这样做的原因是,如果没有什么可读的,我不想占用太多的资源,一秒钟的延迟也不是问题。唯一不好的一面是套接字没有跳转线程的灵活性,因此最坏的情况是一个线程超负荷工作,而其他线程什么也不做

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

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

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

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

可能有太多的插槽和使用太多的内存

通过这种方式可以达到1000到10000。内存比12年前引入NIO时便宜得多,线程比过去更高效、更可扩展

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

我使用了一种暂停,忙碌的人会等待一小段时间,然后休息,最后逐渐入睡

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

唯一不好的一面是套接字没有跳转线程的灵活性,因此最坏的情况是一个线程超负荷工作,而其他线程什么也不做

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

我必须检查插座

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

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

您似乎正在寻找。请查看