当前位置: 首页 > 面试题库 >

wait / notify和wait / interrupt有什么区别?

颛孙庆
2023-03-14
问题内容
synchronized (Foo.class) {
    while (someCondition) {
        try {
            Foo.class.wait();
        } catch (InterruptedException e) {
            e.printStackTrace();            
        }
    }
}

似乎该线程都在其他线程调用interrupt()notify()在此线程上唤醒。两者之间有什么区别吗?

- 编辑 -

我知道一个是通知对象,另一个是中断线程。但是,这两种情况都会导致相同的结果,也就是说,该线程被唤醒,所以我想问的是这两种情况的后果是如何不同的。


问题答案:

当线程在某个监视器上调用notify时,它将唤醒在该监视器上等待的单个线程,但是 哪个
线程被唤醒由调度程序决定。(或者,一个线程可以调用notifyAll,唤醒所有等待该监视器的线程,然后它们都争夺该监视器,然后失败者回到等待状态。)这就是为什么调用的目标不同,所以发出通知的原因监视器,它告诉调度程序选择一个线程来唤醒。

与通知不同,中断针对特定线程。并且中断不需要被中断的线程在监视器上等待。要使线程在监视器上调用wait,它必须先获取该监视器,然后再等待以释放该监视器,直到线程完成等待或中断为止。

Oracle的建议是仅将中断用于取消。同样,java.util.concurrent中的类也设计为使用中断进行取消。

在您的示例中,中断将不会非常有效,因为控制不会离开while循环,线程仍然必须检查其等待的条件,并且在while循环条件中没有检查是否设置了中断标志。被中断的线程很可能会回到等待状态。

为了使此代码在被中断后立即退出,而不是返回等待状态,请在循环条件中添加对中断标志状态的检查,并让catch块设置中断标志(在引发异常时将其重置):

synchronized (Foo.class) {
    while (someCondition && !Thread.currentThread().isInterrupted()) {
        try {
            Foo.class.wait();
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();            
        }
    }
}


 类似资料:
  • 本文向大家介绍sleep() 和 wait() 有什么区别?相关面试题,主要包含被问及sleep() 和 wait() 有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 类的不同:sleep() 来自 Thread,wait() 来自 Object。 释放锁:sleep() 不释放锁;wait() 释放锁。 用法不同:sleep() 时间到会自动恢复;wait() 可以使用 notify()

  • 本文向大家介绍sleep()和 wait() 有什么区别?相关面试题,主要包含被问及sleep()和 wait() 有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 答: sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后,线程 不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被 调度为放弃执行,除非(a)“醒来”的线程具有更高的优先级 (b)正在

  • 我有个问题。当我在synchronized块中使用时,我有IllegalMonitorStateException。有谁能帮我解决这个问题吗? 我必须这样做,一个线程将发送到第二个线程char,然后这个线程必须等待和第二个线程打印这个char。在第二个线程等待之后,第一个线程再次发送下一个字符 main.java:

  • 问题内容: 我正在尝试检查java中的wait / notify如何工作。 码: 输出返回 我期望在执行notify()时,等待将结束并被打印。但似乎只有完成打印后才能打印。 问题答案: 对象监视器锁需要执行相同锁的单个引用。 在你的榜样,你是对的一个实例,但使用从。相反,您应该使用单个通用锁定对象…例如 输出… 并可能根据线程调度更改位置。 您可以尝试将睡眠排除在障碍之外。这将释放监视器锁定,从

  • 我试图做到这一点:创建两个不同的线程,一个打印奇数,一个打印偶数。一旦一个线程打印出一个数字,它就必须等待另一个线程,以此类推,这是一个接一个的。 为了实现这一点,我将使用synchronized block以及wait()和notify()。 我正在创建一个类,该类的对象将用于传递给两个线程中的同步块。 -- --- SyncObject作为参数传递给main中的这些不同线程。 但是,此程序会停

  • 本文向大家介绍请说明一下sleep() 和 wait() 有什么区别?相关面试题,主要包含被问及请说明一下sleep() 和 wait() 有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 考察点:线程 sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,把执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。 wait是Object类的