我在接受采访时被问到这个问题。
How you can create your own notify() method ?
我告诉我这是一种native
方法,无法覆盖。
但她对答案不满意。
有人可以解释一下吗?
答案 0 :(得分:2)
我想面试官想要一个等同于wait / notify机制的java实现,而不直接使用Object.wait()和Object.notify()。
例如,以下任何高级同步机制都可用于模拟wait / notify:
但请注意,语义可能与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上),它会带来其中一个回到可运行的状态。正如其他人所指出的,这看起来确实类似于观察者模式。不确定这是否是一个非常好的答案,但它是我想到的最好的答案。