在Java中sleep 和 wait之间的区别
时间:2020-02-23 14:34:07 来源:igfitidea点击:
在Java中睡眠和等待之间有什么区别
sleep
- 它导致电流执行线程以睡眠特定的时间。
- 其准确性取决于系统定时器和调度员。
- 它一直留给
monitors
它已获取,因此如果从同步上下文调用,则没有其他线程可以输入该块或者方法。 - 如果我们调用
interrupt()
方法,它会唤醒睡眠线程。
synchronized(lockedObject) { Thread.sleep(1000); //It does not release the lock on lockedObject. //So either after 1000 miliseconds, current thread will wake up, or after we call //t. interrupt() method. }
wait
- 它导致当前线程等待直到另一个线程调用此对象的Notify()方法或者NotifyAll()方法
- 它必须从
synchronized
例如:从块或者方法。它在等待()方法之前的方法,当前线程必须在该对象上锁定。 - 它将锁定在调用并添加到等待列表中的对象上的锁定,因此另一个线程可以在对象上获取锁定。
synchronized(lockedObject) { lockedObject.wait(); //It releases the lock on lockedObject. //So until we call notify() or notifyAll() from other thread,It will //not wake up }
睡眠vs等待:
比较项 | wait | sleep |
---|---|---|
同步 | 等待应该从同步上下文调用:从块或者方法,如果我们不使用同步上下文调用它,它将抛出IllegalMonitorTateException | 不需要从同步块或者方法调用 |
调用 | wait方法在对象上运行并在对象类中定义 | sleep 方法在当前线程上运行,在java.lang.thread |
释放锁 | wait调用对象的释放锁和对象持有其他锁 | 睡眠方法根本不释放锁 |
唤醒条件 | 直到调用notify()或notifyAll()from Object类。 | 直到时间到期或调用中断() |
静态 | wait是非静态方法 | sleep是静态方法 |