对这个重复的问题道歉,但我还没有找到任何令人满意的答案.大多数问题都有自己的特定用例:

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的原因的任何建议被认为是一个如此糟糕的想法,以及实现上述相同的替代选项.

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐