Java事件循环,sleep";“轻轻地”;

Java事件循环,sleep";“轻轻地”;,java,sleep,event-loop,Java,Sleep,Event Loop,我正在做一种事件循环来处理Java中的多个非阻塞套接字。 问题是当我保持循环不变时,它使用了一个完整的核心。(例如,我有一个四核,每次启动程序时,CPU都会跳到25%。) 我知道我可以使用Thread.sleep()来降低处理器的使用速度,但我想知道是否有合适的方法来实现这一点。我感觉像线程。睡眠(1)可能限制了我的事件循环 所以我的问题是,我应该怎么做?有没有合适的方法?我应该降低线程的优先级吗?我应该使用Thread.sleep(0,一些纳秒量)吗?所有的睡眠方法都将在1毫秒内至少睡眠一段时

我正在做一种事件循环来处理Java中的多个非阻塞套接字。 问题是当我保持循环不变时,它使用了一个完整的核心。(例如,我有一个四核,每次启动程序时,CPU都会跳到25%。)

我知道我可以使用Thread.sleep()来降低处理器的使用速度,但我想知道是否有合适的方法来实现这一点。我感觉像线程。睡眠(1)可能限制了我的事件循环


所以我的问题是,我应该怎么做?有没有合适的方法?我应该降低线程的优先级吗?我应该使用Thread.sleep(0,一些纳秒量)吗?

所有的睡眠方法都将在1毫秒内至少睡眠一段时间。您可以使用较短的yield(),但通常不会放弃CPU

如果您正忙于等待一组套接字,那么最终将使用整个cpu,或者您将有毫秒延迟


更好的解决方案是使用选择器等待套接字准备好使用,或者使用每个连接的线程阻塞NIO。

我已经尝试了thread.yield();不起作用。netbeans还表示,产量可能会导致我正在使用的同步出现问题。大多数使用非阻塞IO的人使用
select()
方法等待内容。如果你不是,也许你应该。或者,您应该向我们展示您的代码,并说明为什么您不能。但是,除非您希望同时连接数千个套接字,否则,使用多线程的传统阻塞IO几乎肯定就足够了,而且肯定更容易实现。您对“进程”的确切含义是什么?不要重新发明轮子。我实际上想做的是一种选择器。我的目标是能够只使用一个线程和一个触发事件的“处理循环”来处理多个通道。另外,其中一个原因是我不喜欢选择器在Java.AFAIK中的工作方式;使用选择器、定期轮询或忙等待。我也不喜欢选择器,所以我使用阻塞NIO或忙等待。