常见的面试问题之一是“之间有什么区别 睡觉 和 等待 在java中”在我们真正看到差异之前,请先简要介绍一下两者。
睡觉
- 它使当前正在执行的线程休眠特定时间。
- 其准确性取决于系统计时器和调度程序。
- It keeps the
monitors
it has acquired, so if it is called from 已同步 context, no other thread can enter that block or method. - If we call
interrupt()
method , it will wake up the 睡觉 ing thread.
1 2 3 4 5 6 7 8 |
已同步(LockedObject) { 线 . 睡觉 (1000); //它不会释放对lockedObject的锁定。 //因此,或者在1000毫秒后,当前线程将唤醒,或者在我们调用之后 //t. interrupt() method. } |
等待
- 它导致当前线程等待,直到另一个线程为此对象调用notify()方法或notifyAll()方法
- It must be called from
已同步
context i.e. from block or method.It means before 等待 () method is called,current thread must have lock on that object. - 它在调用它的对象上释放锁定,并将其添加到等待列表中,以便另一个线程可以在该对象上获取锁定。
1 2 3 4 5 6 7 8 |
已同步(LockedObject) { LockedObject. 等待 (); //释放对lockedObject的锁定。 //因此,直到我们从其他线程调用notify()或notifyAll()为止,它将 //不醒 } |
睡眠与等待:
参数
|
等待
|
睡觉
|
同步化
|
应该从同步上下文即块或方法中调用wait,如果不使用同步上下文调用它,则会抛出IllegalMonitorStateException |
不需要从同步块或方法中调用
|
呼吁
|
等待 方法在Object上操作并在Object类中定义 |
睡觉 method operates on current thread 和 is 在java中.lang.Thread
|
解除锁定
|
等待对其调用的对象的释放锁,以及持有该锁的其他锁
|
睡眠方法根本不释放锁
|
唤醒条件
|
直到从Object类调用notify()或notifyAll()
|
直到时间到期或调用interrupt()
|
静态的
|
等待是非静态方法
|
睡眠是静态方法
|
你可以经历 爪哇 核心面试题 对于初学者和有更多此类问题的经验丰富的人。