`
tomotoboy
  • 浏览: 166863 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

wait、sleep、notify、notifyAll……

阅读更多
wait()
Causes the current thread to wait until either another thread invokes the notify()method or the notifyAll() method for this object, or a specified amount of time has elapsed. The current thread must own this object's monitor.
当线程调用wait()方法后,当前线程失去对象监视器。
此方法导致当前线程(称之为 T)将其自身放置在对象的等待集中,然后放弃此对象上的所有同步要求。出于线程调度目的,在发生以下四种情况之一前,线程 T 被禁用,且处于休眠状态:

其他某个线程调用此对象的 notify 方法,并且线程 T 碰巧被任选为被唤醒的线程。
其他某个线程调用此对象的 notifyAll 方法。
其他某个线程中断线程 T。
大约已经到达指定的实际时间。但是,如果 timeout 为零,则不考虑实际时间,在获得通知前该线程将一直等待。
然后,从对象的等待集中删除线程 T,并重新进行线程调度。然后,该线程以常规方式与其他线程竞争,以获得在该对象上同步的权利;一旦获得对该对象的控制权,该对象上的所有其同步声明都将被恢复到以前的状态,这就是调用 wait 方法时的情况。然后,线程 T 从 wait 方法的调用中返回。所以,从 wait 方法返回时,该对象和线程 T 的同步状态与调用 wait 方法时的情况完全相同。
在没有被通知、中断或超时的情况下,线程还可以唤醒一个所谓的虚假唤醒 (spurious wakeup)。虽然这种情况在实践中很少发生,但是应用程序必须通过以下方式防止其发生,即对应该导致该线程被提醒的条件进行测试,如果不满足该条件,则继续等待。


sleep()
Causes the currently executing thread to sleep (temporarily ceaseexecution) for the specified number of milliseconds, subject to the precision and accuracy of system timers and schedulers. The thread  does not lose ownership of any monitors.
当线程调用sleep()方法后,当前线程不会失去对象监视器。

notify()
Wakes up a single thread that is waiting on this object's monitor. If any threads are waiting on this object, one of them is chosen to be awakened. The choice is arbitrary and occurs at  the discretion of the implementation. A thread waits on an object's monitor by calling one of the wait methods.
唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。选择是任意性的,并在对实现做出决定时发生。线程通过调用其中一个 wait 方法,在对象的监视器上等待。
直到当前线程放弃此对象上的锁定,才能继续执行被唤醒的线程。被唤醒的线程将以常规方式与在该对象上主动同步的其他所有线程进行竞争;例如,唤醒的线程在作为锁定此对象的下一个线程方面没有可靠的特权或劣势。

此方法只应由作为此对象监视器的所有者的线程来调用。通过以下三种方法之一,线程可以成为此对象监视器的所有者:

通过执行此对象的同步实例方法。
通过执行在此对象上进行同步的 synchronized 语句的正文。
对于 Class 类型的对象,可以通过执行该类的同步静态方法。
一次只能有一个线程拥有对象的监视器。


notifyAll()
Wakes up all threads that are waiting on this object's monitor. A thread waits on an object's monitor by calling one of the wait methods.The awakened threads will not be able to proceed until the current thread relinquishes the lock on this object. The awakened threads will compete in the usual manner with any other threads that might be actively competing to synchronize on this object; for example,the awakened threads enjoy no reliable privilege or disadvantage in being the next thread to lock this object.

分享到:
评论

相关推荐

    java之wait,notify的用法([ 详解+实例 ])

    wait方法是Object类的一个方法,用于让当前线程进入等待状态,直到其他线程调用notify或notifyAll方法来唤醒它。在wait方法中,当前线程会释放它所占有的锁,并进入等待状态。wait方法可以带有参数,指定等待的时间...

    深入理解Wait、Notify和Wait与sleep区别

    - **唤醒机制**:`wait()`需要其他线程调用`notify()`或`notifyAll()`来唤醒,而`sleep()`结束后会自动恢复执行。 - **唤醒策略**:`wait()`可能唤醒单个或所有等待线程,而`sleep()`结束后自动唤醒自身。 在实际...

    Java多线程wait和notify

    `wait()` 方法会让当前持有锁的线程进入等待状态,释放锁,直到其他线程调用 `notify()` 或 `notifyAll()` 唤醒它。`notify()` 则会随机选择一个等待在该对象监视器上的线程并唤醒它,而 `notifyAll()` 则会唤醒所有...

    wait和notifyAll方法的使用示例

    当其他线程调用同一个对象的 `notify()` 或 `notifyAll()` 方法时,等待线程有机会重新获得锁并继续执行。需要注意的是,调用 `wait()` 方法必须在 `synchronized` 块或方法中进行,否则会抛出 `...

    一个理解wait()与notify()的例子

    - 调用`b.wait()`,这会让当前线程进入等待状态,直到另一个线程调用`b.notify()`或`b.notifyAll()`唤醒它。 - 输出完成后的总和。 - **`ThreadB`类**: - 继承自`Thread`类,重写了`run`方法。 - 在`run`方法...

    多线程sleep,yield,wait区别

    `sleep()` 适用于需要让线程暂时退出执行的情况,`yield()` 用于尝试平衡多个线程的执行,而 `wait/notify/notifyAll()` 则用于线程间的协作,确保资源的有效共享。理解这些方法的差异和使用场景,能帮助开发者更好...

    sleep() 方法和wait()方法的区别.docx

    wait() 方法可以通过 notify 或者 notifyAll 或者指定睡眠时间来唤醒当前等待池中的线程。 sleep() 和 wait() 方法的区别 sleep() 和 wait() 方法的最大区别是: 1. sleep() 睡眠时,保持对象锁,仍然占有该锁; ...

    详解Java中wait和sleep的区别

    对于wait()方法,我们可以通过调用notify()或notifyAll()方法来唤醒线程,而对于sleep()方法,线程会在指定的时间间隔后自动唤醒。 wait()和sleep()方法都是Java多线程编程中重要的概念,它们之间的...

    java sleep()和wait()

    2. **线程的唤醒**:`sleep()`方法的线程在指定的时间结束后会自动恢复执行,而`wait()`方法的线程需要被其他线程显式地唤醒(`notify()`或`notifyAll()`方法)。 3. **调用位置**:`sleep()`可以在任何地方调用,而`...

    java面试题经典讲解2023年最新题目分析.docx

    10. HashMap什么样的类适合作为键String最为常见,因为String对象不可变,且重写了equals和hashcode方法。...sleep可在任意地方使用,wait notify notifyAll只能在synchronized块\方法中使用。sleep必须捕获异常

    Sleep和Wait的区别.pdf

    - `wait`需要通过`notify`或`notifyAll`方法来唤醒等待的线程。 了解这些区别有助于更好地设计和优化多线程程序。在实践中,根据具体需求选择合适的方法是非常重要的。例如,在简单的延时操作中使用`sleep`方法更为...

    C#中sleep和wait的区别分析

    当一个线程调用 `Wait` 方法时,它会释放当前持有的对象锁,进入等待状态,并且只有在其他线程调用相同对象的 `Notify` 或 `NotifyAll` 方法后才会被唤醒。这种方式常用于实现线程间的通信和协作,比如生产者消费者...

    java sleep和wait的解惑.docx

    `Object.wait()` 需要其他线程调用 `notify()` 或 `notifyAll()` 来恢复执行。 - **线程状态**:`Thread.sleep()` 导致线程进入 `BLOCKED` 状态;`Object.wait()` 导致线程进入等待队列。 #### 五、示例代码 以下...

    详解Java中的sleep()和wait()的区别

    在Java编程语言中,`sleep()` 和 `wait()` 都是用来控制线程执行的重要方法,但它们的作用和使用场景有着显著的区别。以下是这两个方法的详细解释: 1. **`Thread.sleep(long milliseconds)`** - `sleep()` 方法是...

    sleep()、wait()、yield()和join()方法特点及区别.docx

    3. **调用位置**:`wait()`, `notify()`和`notifyAll()`必须在同步环境中(同步方法或同步代码块)调用,而`sleep()`可以在任何地方调用。 4. **异常处理**:`sleep()`方法需要捕获`InterruptedException`,而`wait...

    Java线程中wait,await,sleep,yield,join用法总结.pdf

    wait()、notify()和notifyAll()是Object类的方法,用于控制线程在特定条件下暂停执行和恢复执行。 - wait():当一个线程调用某个对象的wait()方法时,当前线程会释放对象锁,并进入该对象的等待队列。线程需要在...

    java多线程.pdf

    Java提供了多种同步机制来控制多个线程对共享资源的互斥访问,包括synchronized关键字和Object类中的wait、notify和notifyAll方法。synchronized关键字可以用来修饰方法或者代码块,确保同一时刻只有一个线程可以...

    java中yieldsleep以及wait的区别.pdf

    `wait()`、`notify()`和`notifyAll()`必须在`synchronized`块或方法中调用,否则会抛出`IllegalMonitorStateException`异常。这些方法是Java中实现线程间通信的关键,允许线程在满足特定条件时释放资源并等待,然后...

    Java多线程通信wait()和notify()代码实例

    wait()方法将当前线程放入该对象的等待队列中,直到其他线程调用notify()或notifyAll()方法将其唤醒。wait()方法释放当前线程的锁,允许其他线程访问该对象。 在上面的代码实例中,print1()方法和print2()方法使用...

    线程中sleep、join、yield、wait的区别

    当一个线程调用对象的 `wait()` 方法时,它会释放对象的锁并进入等待状态,直到其他线程调用 `notify()` 或 `notifyAll()` 来唤醒它。这个方法通常与 `synchronized` 关键字一起使用,以确保线程安全地访问共享资源...

Global site tag (gtag.js) - Google Analytics