【问题标题】:How we can create `notify()` method in object? [closed]我们如何在对象中创建 `notify()` 方法? [关闭]
【发布时间】:2014-04-23 22:27:29
【问题描述】:

我在一次采访中被问到这个问题。

How you can create your own notify() method ?

我告诉过这是一个native 方法,不能被覆盖。

但她对这个答案并不满意。

谁能解释一下?

【问题讨论】:

  • 我认为创建你自己的有一个提示,它不需要被称为notify()
  • 本机方法可以被覆盖。 notify() 不能被覆盖,因为它是 final
  • @skiwi 请详细说明。
  • @Thinker 我将这个问题解释为创建 一些 notify() 等效方法,因此您也可以将其称为 myOwnNotify() 并提供您自己的实现。
  • 也许她在谈论自己实现观察者模式......

标签: java multithreading wait notify


【解决方案1】:

如果您有权访问线程调度程序或线程管理器(或在 JVM 中调用的任何东西),您可以使用哈希表实现通知,该哈希表说明哪个线程正在等待哪个对象的监视器。所以我的意思是一个哈希表映射对象到线程。当在对象 obj 上调用 notify 时,您的线程调度程序应该得到一个关于此的事件,然后它会查找哪些线程正在等待这个特定对象的监视器(即在 obj 上),并将其中一个线程带回可运行状态.正如其他人指出的那样,这看起来确实类似于观察者模式。不确定这是否是一个很好的答案,但这是我想到的最好的答案。

【讨论】:

    【解决方案2】:

    我猜面试官想要一个等效于等待/通知机制的 java 实现,而不直接使用 Object.wait() 和 Object.notify()。

    例如,可以使用以下任何高级同步机制来模拟等待/通知:

    • BlockingQueue 实现
    • 同步队列
    • CountDownLatch
    • 循环障碍
    • 期货

    但是请注意,语义可能与等待/通知略有不同。与标准等待/通知不同,例如使用阻塞队列,您的优势是“通知”会被等待者线程捕获,即使它在通知时并未等待。

    以下是使用 SynchronousQueue 的一个非常简单的实现:

    public class WaitNotify {
      private final Object ITEM = new Object(); 
      private final SynchronousQueue<Object> q = new SynchronousQueue<Object>();
    
      public void myNotify() {
        q.offer(ITEM);
      }
    
      public void myWait() throws InterruptedException {
        q.take();    
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-04-18
      • 1970-01-01
      • 2018-05-08
      • 2018-10-19
      • 1970-01-01
      • 2017-12-25
      • 1970-01-01
      • 2014-08-05
      • 1970-01-01
      相关资源
      最近更新 更多