使线程进入睡眠状态 30 分钟

2022-09-01 22:01:24

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


答案 1

你可以让你的线程休眠30分钟,如下所示:

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

使用 Thread.sleep 本身并不是坏事。简单地说,它只是告诉线程调度程序抢占线程。 当它被错误地使用时是坏的。Thread.sleep

  • 在不释放(共享)资源的情况下休眠:如果线程使用来自共享连接池的打开数据库连接或内存中有大量引用的对象进行休眠,则其他线程无法使用这些资源。只要线程处于休眠状态,这些资源就会被浪费。
  • 用于防止争用条件:有时,您可以通过引入 .但这不是一种有保证的方式。使用互斥锁。请参阅 Java 中是否有互斥体?sleep
  • 作为保证定时器:睡眠时间不保证。它可能会过早地返回一个 .或者它可能会睡过头。Thread.sleepInterruptedException

    文档中

    public static void sleep(long millis) throws InterruptedException
    

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


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

TimeUnit.MINUTES.sleep(30);

答案 2

Krumia的答案已经完美地展示了如何睡觉跑步 。有时,线程休眠或暂停的要求源于以后执行操作的愿望。如果是这种情况,您最好使用更高层次的概念,如 或 :ThreadTimerScheduledExecutorService

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

您希望在 30 分钟内执行的位置。operationRunnable

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

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