关于sleep()和wait()

本文详细对比了Java中sleep与wait方法的区别与联系,解析了它们在多线程环境下的作用机制,包括锁行为、中断响应及使用场景等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java中的多线程是一种抢占式的机制,而不是分时机制。抢占式的机制是有多个线程处于可运行状态,但是只有一个线程在运行。 
共同点  
1. 他们都是在多线程的环境下,都可以在程序的调用处阻塞指定的毫秒数,并返回。 
2. wait()和sleep()都可以通过interrupt()方法 打断线程的暂停状态 ,从而使线程立刻抛出InterruptedException。 
如果线程A希望立即结束线程B,则可以对线程B对应的Thread实例调用interrupt方法。如果此刻线程B正在wait/sleep/join,则线程B会立刻抛出InterruptedException,在catch() {} 中直接return即可安全地结束线程。 
需要注意的是,InterruptedException是线程自己从内部抛出的,并不是interrupt()方法抛出的。对某一线程调用 interrupt()时,如果该线程正在执行普通的代码,那么该线程根本就不会抛出InterruptedException。但是,一旦该线程进入到 wait()/sleep()/join()后,就会立刻抛出InterruptedException 。 
不同点 :  
1.每个对象都有一个锁来控制同步访问。Synchronized关键字可以和对象的锁交互,来实现线程的同步。 
sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。 
2.wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用 
3.sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常 
4.sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。
5.wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
### Sleep Wait 方法在编程线程同步中的比较 #### 定义与功能差异 `Sleep` 是一种使当前执行的线程暂停指定时间的方法,在这段时间内该线程不会占用 CPU 资源[^1]。而 `Wait` 则用于让某个对象上的锁被释放,直到另一个线程调用了相应的通知方法(如 Notify 或 Signal),才会重新获取锁并继续执行。 对于多线程环境下的资源管理而言: - 使用 `Thread.Sleep(int millisecondsTimeout)` 可以简单地延迟一段时间后再恢复操作; - 对象级别的等待则通过 Monitor.Wait(object obj),它不仅会挂起当前线程,还会暂时放弃对该监视器持有的独占访问权,允许其他处于准备状态的线程进入临界区。 ```csharp // C# 中使用 Thread.Sleep 的例子 using System; using System.Threading; class Program { static void Main(string[] args) { Console.WriteLine($"Start at {DateTime.Now}"); // 让主线程休眠两秒 Thread.Sleep(2000); Console.WriteLine($"End at {DateTime.Now}"); } } ``` ```java // Java 中 Object.wait() 示例 public class TestWaitNotify { public synchronized void waitForSignal() throws InterruptedException{ System.out.println(Thread.currentThread().getName()+" waiting..."); wait(); // 当前线程在此处阻塞,直到收到 notify/notifyAll 唤醒信号 System.out.println(Thread.currentThread().getName()+" got signal"); } public synchronized void sendSignal(){ notify(); System.out.println("signal sent by "+Thread.currentThread().getName()); } } ``` #### 应用场景对比 当只需要简单的延时处理而不涉及复杂的并发控制逻辑时,可以考虑采用 `Sleep` 方式;但如果涉及到多个线程间协作以及共享数据的安全访问,则更适合运用基于条件变量机制实现的 `Wait` 来完成更精细的操作调度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值