让线程睡眠30分钟
我想让我的线程等待30分钟。 这样做有什么问题吗?
你可以让你的线程睡30分钟,如下所示:
Thread.sleep(30 * // minutes to sleep 60 * // seconds to a minute 1000); // milliseconds to a second
使用Thread.sleep
并不是坏事。 简单地说,它只是告诉线程调度程序抢占线程。 如果使用不当, Thread.sleep
很糟糕。
- 在不释放(共享)资源的情况下hibernate :如果您的线程正在与来自共享连接池的开放数据库连接或内存中的大量引用对象一起hibernate,则其他线程无法使用这些资源。 只要线程hibernate,这些资源就会被浪费掉。
- 用于防止竞争条件 :有时您可以通过引入
sleep
来实际解决竞争状况。 但这不是一种保证方式。 使用互斥锁。 请参阅Java中是否存在互斥锁? -
作为保证计时器 :不保证
Thread.sleep
的hibernate时间。 它可能会因InterruptedException
过早返回。 或者它可能睡过头了。从文档 :
public static void sleep(long millis) throws InterruptedException
导致当前正在执行的线程hibernate(暂时停止执行)指定的毫秒数,具体取决于系统计时器和调度程序的精度和准确性 。
您也可以使用,正如kozla13在评论中所示:
TimeUnit.MINUTES.sleep(30);
Krumia的答案已经完美地展示了如何睡眠正在运行的Thread
。 有时,睡眠或暂停线程的要求源于希望在以后执行操作。 如果是这种情况,您应该更好地使用更高级别的概念,如Timer
或ScheduledExecutorService
:
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);