【问题标题】:Make a java program sleep without threading使 java 程序在没有线程的情况下休眠
【发布时间】:2012-03-15 09:31:09
【问题描述】:

我有一个 java 程序,它进行一些计算,然后将结果上传到 MYSQL 数据库(托管在同一网络中的另一台计算机上)。我有时会遇到程序计算速度比上传结果快的问题。因此它无法上传所有结果。该程序当前没有线程化。

有没有办法让程序在完成计算后休眠几毫秒,以便正确上传。 (就像其他语言的睡眠或等待功能)

我可以对程序进行线程化,但这将是太多的重写。有没有更简单的方法?

谢谢

【问题讨论】:

  • 我很好奇单线程程序如何比另一件事更快地完成一件事,并且由于时间问题而以某种方式使其失败。如果它是单线程的,那么这些操作是顺序的。您是否正在使用库或其他东西来上传在不同线程或其他东西中工作的东西?如果它真的是单线程的,那么这个场景实际上没有意义。
  • @Robin:我认为唯一可能的方法是 Ankur 的应用程序正在注册或执行某种异步进程。单线程应用程序可能位于被某个异步事件中断的单线程逻辑中。尽管如此,睡眠不应该是尝试解决问题的第一个想法。
  • 我在我的程序中使用了第 3 方 API。他们可能在程序中创建线程导致异步。
  • 如果您只是粘贴代码,我们可能会看到真正的问题是什么。我不知何故怀疑你正在做任何与你使用 jdbc 相关的异步工作。您还在使用哪些其他第三方 API?

标签: java multithreading sleep


【解决方案1】:

有没有办法让程序在完成计算后休眠几毫秒,以便正确上传。 (就像其他语言的睡眠或等待功能)

Thread.sleep(milliseconds) 是一个公共静态方法,也适用于单线程程序。类似以下的内容是典型的模式:

try {
    // to sleep 10 seconds
    Thread.sleep(10000);
} catch (InterruptedException e) {
    // recommended because catching InterruptedException clears interrupt flag
    Thread.currentThread().interrupt();
    // you probably want to quit if the thread is interrupted
    return;
}

不需要实现Runnable 或对线程调用做任何其他事情。您可以随时调用它来暂停某些代码。

【讨论】:

  • 我是否在主类中实现 Runnable?
【解决方案2】:

您不必重新穿线或任何类似的事情。您需要做的就是调用:

Thread.Sleep(5000); // pause the app for 5 seconds

每个应用程序也是一个线程,在您的情况下也称为单线程应用程序。您可以使用诸如 Sleep 之类的线程 API,而无需任何其他代码或重构。

请注意:如果您需要使用 Thread.Sleep 来管理您的控制流,那么架构上可能会出现问题。从您的 OP 来看,我比您所描述的单线程应用程序更担心您似乎有一个操作“超过”另一个操作。这应该是不可能的,除非您从其他地方接收异步事件。

另一个警告:Sleep 需要一个毫秒参数,该参数通常是任意的,仅表示“稍等片刻”。问题是今天“一会儿”可能还可以,但明天您的机器将承受更大的负载,“一会儿”将不再足够好,您的睡眠将失效并出现相同的错误。当然,您可以将超时设置为“很长一段时间”,但随后您将等待每笔交易“很长时间”……第 22 条。

【讨论】:

  • 架构上可能出现问题是什么意思?对不起,我没明白!
  • @Ankur:查看我最近的编辑。 Thread.Sleep 通常是解决时间问题的方法。如果代码都是你自己的,那么时间问题将是你自己创造的。 IE。 Sleep 可以破解您无法控制的第 3 方 API 和服务,但如果您拥有代码,请不要急于使用它。
  • 我确实拥有代码,但我在其中使用 MySQL API 和另一个第三方 API。你推荐 Thread.Sleep() 吗?
  • 所以你不拥有(没有创建)所有代码。你依赖于其他人的代码。尽管如此,我还是不推荐 Sleep w/o 看到更多问题。我建议您在使用 Sleep 之前先弄清楚为什么会不同步。
  • 如果我是你,我会这样做:获取问题的基线样本。例如今天,明天有多少错过的条目?然后输入 Sleep(5000) 并记录事件数。评估差异。如果它很重要,请尝试通过日志记录和其他故障排除来解决问题,不要将睡眠用作拐杖。如果差异很小,除了时间还有其他问题。
【解决方案3】:

使用Thread.sleep():

try
{
    Thread.sleep(1000); // Sleep for one second
}
catch (InterruptedException e)
{
    Thread.currentThread().interrupt();
}

这不会在程序中引入新的Thread 或需要任何其他与Thread 相关的机制。

【讨论】:

【解决方案4】:

只需使用:-

try
{
Thread.sleep(<time in ms>);
}
catch(InterruptedException ex}
{
}

这将使当前线程(例如主线程)休眠。

【讨论】:

  • 我是否在主类中实现 Runnable?
  • 不,不需要实现Runnable。上面的代码是在调用一个静态方法休眠一会,恰好在Thread类中。这实际上不是线程化您的代码。
  • @Ankur 不,Thread.sleep() 只是一个常规的静态方法,它的名字很不幸,因为它与线程无关。
  • 仅供参考:建议调用 Thread.currentThread().interrupt();如果你抓住InterruptedException。见:stackoverflow.com/questions/4906799/…
  • @Gray:谢谢。我实际上并没有意识到这一点。
【解决方案5】:

java.lang.Thread 类中的静态方法sleep() 在调用时暂停当前线程(可能只是主线程)。你不需要做任何特别的事情来使用它。

【讨论】:

    【解决方案6】:

    每个 Java 应用程序都在 JVM 中的一个线程中执行。调用静态方法 Thread.sleep 将导致应用程序的线程(正在运行的线程)停止

    【讨论】:

      【解决方案7】:

      您的程序不是多线程...但它正在使用线程。 Thread.Sleep 仍然可以工作。

      【讨论】:

        【解决方案8】:

        你可以在计算后使用Thread.sleep();,而不需要用线程重写你的整个程序!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-09-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-01
          • 1970-01-01
          相关资源
          最近更新 更多