当前位置: 首页 > 面试题库 >

为什么Thread.sleep不好用

莫骞仕
2023-03-14
问题内容

对这个重复的问题表示歉意,但是我还没有找到满意的答案。大多数问题都有自己的特定用例:
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被认为是一个坏主意,以及实现上述目标的替代选择是什么。

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在这里使用。如您所说,无论如何都要阻塞当前线程时生成单独的线程似乎会使事情变得毫无价值。



 类似资料:
  • 问题内容: 我所读到的有关更好的PHP编码实践的所有内容都一直在说不要使用,因为速度太快。 为什么是这样? 做相同的事情的正确/更好的方法是什么?如果有关系,我正在使用PHP 5。 问题答案: 并且都要求系统会记录本已被列入什么/需要的。每个呼叫都意味着检查该日志。因此,肯定 有一些 额外的工作要做,但足以损害整个应用程序的速度吗? …我真的对此表示怀疑…除非您使用的是 真正的 旧硬件或经常这样做

  • 问题内容: 建议不要中使用。 可以分享原因,以便下次避免这样做吗? 问题答案: 因为它将很多东西放到你的命名空间中(可能会遮盖以前导入的其他对象,你对此一无所知)。 因为你不完全知道要导入的内容,而且不容易找到从哪个模块导入的特定内容(可读性)。 因为你不能使用像静态检测代码中的错误之类的出色工具。

  • 所以我理解为什么从异步返回空洞通常没有意义,但我遇到了一种我认为完全有效的情况。请考虑以下人为的示例: 我意识到这是一个不寻常的例子,但我试图使其简单化和更普遍化。有人能向我解释为什么这是可怕的代码,以及我如何修改它以正确遵循约定吗? 谢谢你的任何帮助。

  • 当我使用JavaFX时,sleep函数不会相应地工作。如以下代码所示:

  • 问题内容: 为什么和方法在中定义为方法 ? 问题答案: 该代码仅在执行时执行,在这种情况下,告诉yield将毫无意义。如此以来,只有线程调用价值上是当前线程,它们使该方法这样你就不会浪费时间去打电话的其他线程。

  • 问题内容: 我们都知道 单身 人士有多 糟糕 ,因为他们隐藏了依赖关系以及其他原因。 但是在一个框架中,可能有许多对象只需要实例化一次,并可以 从任何地方 调用(记录器,数据库等)。 为了解决这个问题,有人告诉我使用所谓的“对象管理器”(或诸如symfony之类的服务容器),在内部存储对服务(记录器等)的所有引用。 但是,为什么服务提供者不像单纯的Singleton那样糟糕? 服务提供者也隐藏了依