Java中sleep的最佳实践?

4
背景:我一直习惯将Thread.sleep()函数转换为TimeUnit.XXX.sleep()函数,每当我需要更改包含该函数的代码时都这样做。
问题:首先,这种方法是否可行,或者TimeUnit的休眠存在一些微妙的问题?其次,据我了解,这是在进行网络(或类似)操作重试前等待的最佳方式。
for(int retriesLeft = 3; ;--retriesleft) {
    try {
        doOperation(...);
        break;
    } catch (IOException ex) {
        if (retryCountDown <= 0) throw ex;
        else TimeUnit.SECONDS.sleep(10);
    }
}
< p > "TimeUnit.XXXX.sleep(10)" 是正确的休眠方式吗?还是有更好的方法?如果有更好的Java模式来处理整个网络操作重试逻辑,也请随意评论...< /p >

属于http://codereview.stackexchange.com/ - Mithun Sreedharan
问题能在StackExchange网站之间移动吗? - hyde
1
不应该使用异常来控制流程! - OldCurmudgeon
1
@OldCurmudgeon 异常,特别是已检查的异常,非常适合这种情况。您提出的 API 非常有限:a) 您失去了返回值通信通道(或者至少使其过于复杂)b) 您强制立即处理失败。最后,如果您认为重试不属于故障恢复部门,那么还有什么属于呢? - Marko Topolnik
1
@OldCurmudgeon,您的描述非常精确地匹配了检查异常的使用情况:异常但是预期的事件。 - Marko Topolnik
显示剩余4条评论
2个回答

3

TimeUnit#sleep 是“一个方便的方法,它将时间参数转换成Thread.sleep方法所需的形式。” 因此,它与您的旧代码没有任何区别。


3

1
还有一个版本的Thread#sleep,它也用纳秒作为单位:http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Thread.html#sleep%28long,%20int%29 - Thilo
谢谢您的纠正,我从未使用过纳秒,所以错过了它。 - Metalhead

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接