【发布时间】:2013-07-23 11:52:08
【问题描述】:
对于这个重复的问题,我深表歉意,但我还没有找到任何令人满意的答案。大多数问题都有自己的特定用例:
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 并在那里进行状态轮询。但同样,我们必须使用至少 1 个线程来初始化这个池,在该线程中执行轮询的可运行方法将运行。
关于为什么使用Thread.sleep 被认为是个坏主意的任何建议,以及实现上述相同的替代选项是什么。
【问题讨论】:
-
您的链接是关于 .Net 的。它不适用于 Java。
-
毫无疑问,轮询很糟糕。但如果你没有其他选择,这是你最不应该关心的事情。
-
@StinePike,这是否应该意味着,答案就在博客中?我已经浏览了这篇文章,但除了资源阻塞(已经提到)和这个
The thread needs perform logic every n milliseconds As noted earlier, Sleep means relinquish control. When your thread gets control again isn't up to the thread; so it can't be used for periodic logic.之外,没有看到任何特别的东西,但我认为,他正在谈论恰好在 n 毫秒后进行调度。 -
投票为“太宽泛”的人请告诉我如何才能使其更具体?我已经问了很多有关方法的用例。
标签: java multithreading java-threads