我们如何在对象中创建`notify()`方法?

时间:2014-03-18 10:06:10

标签: java multithreading wait notify

我在接受采访时被问到这个问题。

How you can create your own notify() method ?

我告诉我这是一种native方法,无法覆盖。

但她对答案不满意。

有人可以解释一下吗?

2 个答案:

答案 0 :(得分:2)

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

例如,以下任何高级同步机制都可用于模拟wait / notify:

  • BlockingQueue实施
  • 的SynchronousQueue
  • CountDownLatch
  • 的CyclicBarrier
  • 期货

但请注意,语义可能与wait / notify略有不同。与标准等待/通知不同,例如,使用阻塞队列,您可以获得"通知"即使在通知时它没有等待,也会被服务员线程捕获。

以下是使用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();    
  }
}

答案 1 :(得分:0)

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