当前位置: 首页 > 知识库问答 >
问题:

Java线程通知()方法

郜杰
2023-03-14

考虑有两个线程正在等待执行同步块。现在有机会在这种情况下等待,我真的需要调用notify()吗?我认为当同步块执行完成时,其他线程会释放锁吗?notify()方法的确切用途是什么?

线程专家请解释?

共有3个答案

汪建白
2023-03-14

从医生那里,

唤醒正在这个对象的监视器上等待的单个线程。如果有任何线程正在等待这个对象,它们中的一个将被唤醒。这种选择是任意的,由实现来决定。线程通过调用其中一个等待方法来等待对象的监视器。

因此,如果对象正在通过调用 Wait 方法等待。然后,您可以使用通知唤醒它们。

谢英光
2023-03-14

当线程进入同步块并调用wait时,在进入同步块时获得的锁被释放,线程等待其他线程通知它,在这种情况下,它将重新获得锁并继续。当线程脱离同步块时,锁再次被释放。

司寇高峯
2023-03-14

不,在这种情况下,您不需要使用通知()。您是正确的,必须等待获取锁的线程将在锁释放后自动继续。

< code>notify()方法与< code>wait()方法结合使用。当一个线程调用< code>wait()时,它可以释放锁并开始等待。可以结束等待的条件之一是当另一个线程调用< code>notify()时。必须在当前线程被< code >同步的实例上调用< code>wait()和< code>notify()。

例如,这可以用来在两个线程之间创建一个通道,其中一个线程正在使用另一个线程产生的信息。如果消费者用完了要处理的信息,它可能会等待()直到生产者执行通知()更多数据可用。

 类似资料:
  • 我对通知方法的一点感到困惑。“notify() :它唤醒一个在同一对象上调用 wait() 的线程。因此,假设两个线程称为等待同一对象。那么当我调用通知时,将通知哪个线程?

  • 我想做一个小练习来习惯等待/通知。我想做的是简单地启动一个线程,然后用等待让它进入睡眠状态,用通知唤醒它,多次。 我的代码是: 我希望这会是这样 相反,这样做: 所以。。。通知似乎没有唤醒打印机线程? 这不应该是一个死锁,因为通过等待,我释放了所有的锁,所以主服务器不应该有任何对打印机的锁,打印机应该能够唤醒并打印。 我做错了什么?

  • 代码: 结果: 代码在jdk1.7和jdk1.8中执行相同的结果。 我的问题: > 线程 A 和线程 B 进入 SYNCHRONIZED 块并调用 wait() 方法后,为什么线程 C 和线程 D 进入而不是线程 A 说 i,然后线程 B 说 i?输入同步块的优先级是否高于刚刚调用 wait() 方法的线程? 为什么调用通知()方法只是唤醒调用等待()方法的最后一个线程?就像线程C和线程D一样,相

  • 问题内容: 我写了一个永远不会停止的测试应用程序。它发出(是一个对象),但是我从不打电话通知。为什么此代码结束?尽管主线程在上同步,但生成的线程仍在运行,因此不会锁定该对象。 结果是主线程等待5秒钟,在此期间工作人员提供其输出。然后,在5秒钟后,程序退出。不等。如果主线程在5秒钟内没有进入睡眠状态(对此行进行了注释),则实际上将等到工作人员完成操作。当然,这里是一种使用方法,但是,出乎意料的是,它

  • 我有一段代码 如您所见,我首先将标志设置为false,这样其中一个线程就可以进入Sum2Elements方法并将其更改为true,从而让所有人都等待。 我知道在同步代码中,只有一个线程可以完成它的任务,这里我有两个同步方法,这是否意味着两个线程在每次通知之后都在尝试执行这个方法? 如果是这样,那么一个线程是否不可能输入Sum2Elements,在另一个线程进入InsertElement之前将标志更

  • 我正在做一个项目,它使用原始Java并发结构,如等待()、通知()、通知()、Thread.run()、同步化等。在我的项目中,有多个线程(线程类的扩展)会定期从队列中获取一个对象。因此,我使用了一个有内部TimerWork类的Timer类。 我的问题是,我无法获得如何让其他线程定期唤醒。我的主要类不是这些线程或计时器类。因此,我从另一个类调用它们的运行。我不知道如何让这些线程每100毫秒等待和通