gpt4 book ai didi

java - 为什么 Thread.sleep 不好用

转载 作者:IT老高 更新时间:2023-10-28 21:15:01 32 4
gpt4 key购买 nike

对于这个重复的问题,我深表歉意,但我还没有找到任何令人满意的答案。大多数问题都有自己的特定用例:
Java - alternative to thread.sleep
Is there any better or alternative way to skip/avoid using Thread.sleep(1000) in Java?

我的问题是针对非常通用的用例。等待条件完成。做一些操作。检查一个条件。如果条件不成立,等待一段时间再做同样的操作。

例如考虑一种通过调用其 createAPI 表来创建 DynamoDB 表的方法。 DynamoDB 表需要一些时间才能变为 Activity 状态,因此该方法将调用其 DescribeTable API 以定期轮询状态,直到某个时间(假设 5 分钟 - 由于线程调度导致的偏差是可以接受的)。如果表在 5 分钟内变为 Activity 状态,则返回 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 并在那里进行状态轮询。但同样,我们必须使用至少 1 个线程来初始化这个池,在该线程中执行轮询的可运行方法将运行。

关于为什么使用 Thread.sleep 被认为是一个坏主意的任何建议,以及实现上述相同的替代选项是什么。

http://msmvps.com/blogs/peterritchie/archive/2007/04/26/thread-sleep-is-a-sign-of-a-poorly-designed-program.aspx

最佳答案

在这种情况下使用 Thread.sleep 很好。人们不鼓励 Thread.sleep 的原因是因为它经常用于修复竞争条件的不良尝试,用于基于通知的同步是更好的选择等。

在这种情况下,AFAIK 您别无选择,只能轮询,因为 API 不向您提供通知。我还可以看到这是一个不常见的操作,因为大概您不会创建数千个表。

因此,我觉得在这里使用 Thread.sleep 很好。正如您所说,无论如何都要阻塞当前线程时生成一个单独的线程似乎会使事情复杂化。

关于java - 为什么 Thread.sleep 不好用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17826651/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com