Thread.sleep()让调用它的当前线程暂停执行,不释放锁,必须处理InterruptedException;误用如myThread.sleep()实为休眠当前线程,正确做法是在目标线程run()中调用。

在Java中,Thread.sleep() 是让当前线程暂停执行指定时间的最直接方式,但它不是“让某个线程睡”,而是“让调用它的那个线程睡”——这点必须明确,否则容易误用。
Thread.sleep(long millis) 和 Thread.sleep(long millis, int nanos) 都是静态方法,作用于当前正在运行的线程。它不会释放已持有的锁(如synchronized锁或ReentrantLock),这点和 wait() 有本质区别。
InterruptedException:该异常是检查型异常,不捕获或声明就会编译失败interrupt() 时会提前唤醒,并抛出 InterruptedException,同时清除中断状态新手常把 sleep 当作控制其他线程的工具,比如在主线程里调用 thread.sleep(),这是无效的——因为 sleep 是静态方法,对谁调用都只影响当前线程。
myThread.sleep(1000); —— 编译通过但实际休眠的是当前线程,不是 myThread
run() 方法内调用 Thread.sleep()
sleep 最适合“单纯延时”,不需要协作或通信;而 wait 必须在同步块中调用,会释放锁并等待通知;LockSupport.park() 更底层,不释放锁,也不需要同步上下文,常用于构建高级并发工具。
立即学习“Java免费学习笔记(深入)”;
sleep:定时轮询、模拟延迟、简单节奏控制wait/notify:线程间协作(如生产者-消费者)park/unpark:实现自定义锁、条件队列等真实项目中,不建议裸写 Thread.sleep(),尤其在需要响应中断的场景。推荐封装成可中断的延时逻辑。
InterruptedException 后,通常应恢复中断状态:Thread.currentThread().interrupt();
System.nanoTime() + 自旋或 ScheduledExecutorServicejoin() 或 CountDownLatch,而非靠 sleep 猜测耗时不复杂但容易忽略细节。掌握 sleep 的作用对象、异常处理和适用边界,就能避开大多数线程阻塞类问题。
以上就是在Java中如何正确使用sleep方法_Java线程休眠机制解析的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号