Java 如何在对象中创建`notify()`方法?
我在一次采访中被问到这个问题Java 如何在对象中创建`notify()`方法?,java,multithreading,wait,notify,Java,Multithreading,Wait,Notify,我在一次采访中被问到这个问题 How you can create your own notify() method ? 我告诉过你这是一个本地的方法,不能被重写 但她对答案并不满意 有人能解释一下吗?如果您可以访问线程调度程序或线程管理器(或JVM中的任何调用),您可以使用一个哈希表来实现notify,该哈希表表示哪个线程正在等待哪个对象的监视器。我指的是将对象映射到线程的哈希表。当在对象obj上调用notify时,您的线程调度程序应该获得一个关于此事件的事件,然后它将查找哪些线程正在等待此
How you can create your own notify() method ?
我告诉过你这是一个本地的方法,不能被重写
但她对答案并不满意
有人能解释一下吗?如果您可以访问线程调度程序或线程管理器(或JVM中的任何调用),您可以使用一个哈希表来实现notify,该哈希表表示哪个线程正在等待哪个对象的监视器。我指的是将对象映射到线程的哈希表。当在对象obj上调用notify时,您的线程调度程序应该获得一个关于此事件的事件,然后它将查找哪些线程正在等待此特定对象的监视器(即在obj上),并将其中一个线程恢复到可运行状态。正如其他人指出的,这看起来确实类似于观察者模式。不确定这是不是一个很好的答案,但这是我想到的最好的答案 我猜面试官想要一个java实现,它相当于wait/notify机制,而不直接使用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();
}
}
公共类WaitNotify{
私有最终对象项=新对象();
private final SynchronousQueue q=新的SynchronousQueue();
公开作废myNotify(){
q、 报价(项目);
}
public void myWait()引发InterruptedException{
q、 take();
}
}
我认为在创建自己的方法时有一个提示,它不必调用notify()
。本机方法可以被重写notify()
无法重写,因为它是final
@skiwi请详细说明。@Thinker我将这个问题解释为创建了一些与notify()等效的方法,因此您也可以将其称为MyowNotify()
,并提供您自己的实现。也许她说的是您自己实现Observer模式。。。