对这个重复的问题表示歉意,但是我还没有找到满意的答案。大多数问题都有自己的特定用例: Java- 替代thread.sleep在Java中,是否有任何更好的替代方法来跳过/避免使用Thread.sleep(1000)?
我的问题是针对非常通用的用例。等待条件完成。做一些操作。检查条件。如果条件不成立,请等待一段时间,然后再次执行相同的操作。
例如,考虑一种通过调用其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
ScheduledThreadPoolExecutor
关于为什么使用的任何建议都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在这里使用。如您所说,无论如何都要阻塞当前线程时生成单独的线程似乎会使事情变得毫无价值。