java - 我们应该在超时时使用 Thread.sleep( ) 吗?

标签 java

考虑以下两个 block :

    // block one
    long start = System.currentTimeMillis();
    while (System.currentTimeMillis() - start < TIMEOUT) {
        if( SOME_CONDITION_IS_MET ) {
            // do something
            break;
        } else {
            Thread.sleep( 100 );
        }
    }

    // block two
    long start = System.currentTimeMillis();
    while (System.currentTimeMillis() - start < TIMEOUT) {
        if( SOME_CONDITION_IS_MET ) {
            // do something
            break;
        }
    }

两者的区别在于第一个有一个Thread.sleep(),貌似可以减少whileif中的条件检查。但是,假设 if 条件没有繁重的计算,通过这种 sleep 有什么有意义的好处吗?您会推荐哪一个来实现超时?

最佳答案

一个关键区别是第二种方法涉及 busy waiting .如果 SOME_CONDITION_IS_MET 不涉及任何 I/O,则第二种方法可能会占用整个 CPU 内核。这是一件很浪费的事情(但在某些——非常罕见的——情况下可能是完全合理的)。另一方面,第二种方法具有较低的延迟。

我同意 Boris 的观点,在一般情况下,这两种方法基本上都是 hack。更好的方法是使用适当的 synchronization primitives发出条件信号。

关于java - 我们应该在超时时使用 Thread.sleep( ) 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26204236/

相关文章:

java - Gradle构建错误

java - while循环初始化但不循环java

java - com.owlike.genson.JsonBindingException : Could not deserialize to type class com. sun.jersey.api.representation.Form

java - 多个方法/常量的一个 javadoc 描述

Java OpenGL 混合图像颜色

java - 如何使用 CachedRowSet 将行插入到具有增量 id 的表中?

java - 对于 OOP,是否应该尽可能频繁地将方法转换为对象?

java - 使用 EclipseLink 在 JPA 2.1 中注册转换器

java - Spring Data返回空元素的List,但List有很多元素

java - 有没有办法将长时间运行的(例如压力测试)分开,这样它们就不会在 Maven 2 中默认运行?