Java 在忙循环时使用Thread.yield()是一种不好的做法吗?

Java 在忙循环时使用Thread.yield()是一种不好的做法吗?,java,serversocket,busy-waiting,busy-loop,Java,Serversocket,Busy Waiting,Busy Loop,在执行任何读/写操作之前,我有一个线程在忙着循环,直到我的ServerSocket对象绑定到一个端口 new Thread(() -> { while (!server.isBound()) { Thread.yield(); // hmm ... any better alternative???? } while (!server.isClosed()) { // do stuff regarding server and cli

在执行任何读/写操作之前,我有一个线程在忙着循环,直到我的
ServerSocket
对象绑定到一个端口

new Thread(() -> {
    while (!server.isBound()) {
        Thread.yield(); // hmm ... any better alternative????
    }
    while (!server.isClosed()) {
        // do stuff regarding server and clients
    }
}, "Server Connection Accept Thread").start();
我在忙循环中使用了
Thread.yield()
,让其他线程在这个线程循环时运行(如果有的话),但是
Thread.yield()的javadoc说

使用这种方法很少合适。它可能对调试或测试有用,因为它可能有助于重现由于竞争条件而产生的bug


现在,这里没有竞争条件,我只需要等待套接字绑定,因为当套接字绑定时没有回调,所以我坚持使用这种方法。有什么建议吗?

使用
Thread.sleep()
可以稍等一会儿吗?循环仍然很紧,占用了大量CPU,尽管它只是在等待。当套接字绑定时,代码是否真的需要立即响应,或者延迟几毫秒就可以了?当然,非常轻微的延迟是可以的,因此最好使用例如
Thread.sleep(100)
在检查之间等待100毫秒。你不会在启动时注意到这样的延迟。它使用了一个CPU核心的所有可用处理能力。如果你在笔记本电脑上运行代码,你会诅咒代码耗尽你的电池而不需要此外,它还迫使CPU切换上下文,并且实际上可能会导致足够多的性能损失,从而引起其他希望使用CPU的程序的注意。特别是如果其他线程和/或程序也使用
yield()
技术。因为你不需要即时反应,所以在
sleep
中使用一点延迟。真正的问题是:为什么代码首先需要一个
isBound
循环?在绑定完成之前,线程不应该被请求运行代码,因此循环应该是不必要的。@DogaOruc When
bind()
返回。你能用
thread.sleep()
等一小段时间吗?循环仍然很紧,占用了大量CPU,即使它只是在等待。当套接字绑定时,代码是否真的需要立即响应,或者延迟几毫秒就可以了?当然,非常轻微的延迟是可以的,因此最好使用例如
Thread.sleep(100)
在检查之间等待100毫秒。你不会在启动时注意到这样的延迟。它使用了一个CPU核心的所有可用处理能力。如果你在笔记本电脑上运行代码,你会诅咒代码耗尽你的电池而不需要此外,它还迫使CPU切换上下文,并且实际上可能会导致足够多的性能损失,从而引起其他希望使用CPU的程序的注意。特别是如果其他线程和/或程序也使用
yield()
技术。因为你不需要即时反应,所以在
sleep
中使用一点延迟。真正的问题是:为什么代码首先需要一个
isBound
循环?在绑定完成之前,不应该请求线程运行代码,因此循环应该是不必要的。@DogaOruc When
bind()
返回。