【问题标题】:Making a Thread to Sleep for 30 minutes让线程休眠 30 分钟
【发布时间】:2014-07-22 05:04:57
【问题描述】:

我想让我的线程等待 30 分钟。这样做有什么问题吗?

【问题讨论】:

  • 是的,有很多问题,因为您的线程将在 30 分钟内什么都不做。 Thread.sleep(1000 * 60 * 30); ,并将其包装在 try-catch 中
  • 不要让线程休眠,而是尝试使用计时器。
  • @Kon - 为什么休眠线程会产生“大量问题”?
  • @TedHopp 在我看来,这是一个糟糕设计的标志。它可能不会导致代码执行出现问题,但使用 Timer 或类似的东西来实现您的最终目标几乎总是更好。
  • 问题的第二部分无法回答。什么算作“问题”?

标签: java multithreading thread-sleep


【解决方案1】:

你可以像这样让你的线程休眠 30 分钟:

Thread.sleep(30 *   // minutes to sleep
             60 *   // seconds to a minute
             1000); // milliseconds to a second

使用Thread.sleep 本身并不是坏事。简单解释,它只是告诉线程调度程序抢占线程。 Thread.sleep 使用不当会很糟糕。

  • 休眠但不释放(共享)资源:如果您的线程在共享连接池中打开数据库连接或内存中有大量引用对象时处于休眠状态,则其他线程无法使用这些资源。只要线程处于休眠状态,这些资源就会被浪费。
  • 用于防止race conditions:有时您可以通过引入sleep 来实际解决竞争条件。但这不是一种保证的方式。使用互斥锁。见Is there a Mutex in Java?
  • 作为有保证的定时器Thread.sleep 的睡眠时间不保证。它可能会以InterruptedException 过早返回。否则它可能会睡过头。

    来自documentation

    public static void sleep(long millis) throws InterruptedException
    

    使当前正在执行的线程休眠(暂时停止执行)指定的毫秒数,取决于系统计时器和调度程序的精度和准确性。。 p>


您也可以使用,正如kozla13 在他们的评论中所显示的那样:

TimeUnit.MINUTES.sleep(30);

【讨论】:

  • 更好的解决方案:TimeUnit.MINUTES.sleep(30);
【解决方案2】:

Krumia 的回答已经完美地展示了如何让正在运行的Thread 睡觉。有时,睡眠或暂停线程的要求源于希望在以后执行操作。如果是这种情况,您最好使用更高级别的概念,例如TimerScheduledExecutorService

ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
executor.schedule(operation, 30, TimeUnit.MINUTES);

其中operation 是您要在30 分钟内执行的Runnable

使用ScheduledExecutorService,您还可以定期执行操作:

// start in 10 minutes to run the operation every 30 minutes
executor.scheduleAtFixedDelay(operation, 10, 30, TimeUnit.MINUTES);

【讨论】:

    猜你喜欢
    • 2015-05-07
    • 1970-01-01
    • 2014-04-11
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多