让线程睡眠30分钟

时间:2014-07-22 05:04:57

标签: java multithreading thread-sleep

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

2 个答案:

答案 0 :(得分:31)

你可以让你的线程像这样睡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
    
         

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


您也可以使用,kozla13在评论中显示:

TimeUnit.MINUTES.sleep(30);

答案 1 :(得分:4)

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);