java – 为什么Thread.sleep使用不好
作者:互联网
对这个重复的问题道歉,但我还没有找到任何令人满意的答案.大多数问题都有自己的特定用例:
Java – alternative to thread.sleep
Is there any better or alternative way to skip/avoid using Thread.sleep(1000) in Java?
我的问题是非常通用的用例.等待条件完成.做一些操作.检查条件.如果条件不成立,请等待一段时间再进行相同的操作.
对于例如考虑一种通过调用其createAPI表来创建DynamoDB表的方法. DynamoDB表需要一些时间才能变为活动状态,因此该方法会调用其DescribeTable API以定期轮询状态,直到某个时间(假设5分钟 – 由于线程调度而导致的偏差是可接受的).如果表在5分钟内变为活动状态,则返回true,否则抛出异常.
这是伪代码:
public void createDynamoDBTable(String name) {
//call create table API to initiate table creation
//wait for table to become active
long endTime = System.currentTimeMillis() + MAX_WAIT_TIME_FOR_TABLE_CREATE;
while(System.currentTimeMillis() < endTime) {
boolean status = //call DescribeTable API to get status;
if(status) {
//status is now true, return
return
} else {
try {
Thread.sleep(10*1000);
} catch(InterruptedException e) {
}
}
}
throw new RuntimeException("Table still not created");
}
据我所知,通过使用Thread.sleep阻塞当前线程,从而消耗资源.但是在一个相当中等规模的应用程序中,一个主题是一个大问题吗?
我读了一些使用ScheduledThreadPoolExecutor并在那里进行状态轮询的地方.但同样,我们必须使用至少一个线程初始化此池,其中运行可执行轮询的runnable方法.
有关使用Thread.sleep的原因的任何建议被认为是一个如此糟糕的想法,以及实现上述相同的替代选项.
解决方法:
在那种情况下使用Thread.sleep很好.人们不鼓励Thread.sleep的原因是因为它常常用于修复竞争条件,用于基于通知的同步是更好的选择等.
在这种情况下,AFAIK您没有选项但是轮询,因为API没有为您提供通知.我也可以看到这是一个不经常的操作,因为大概你不会创建千表.
因此,我觉得在这里使用Thread.sleep很好.如你所说,当你要阻止当前线程时产生一个单独的线程似乎使事情变得复杂而没有任何价值.
标签:java-threads,java,multithreading 来源: https://codeday.me/bug/20190928/1827394.html