Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在对象中创建`notify()`方法?_Java_Multithreading_Wait_Notify - Fatal编程技术网

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模式。。。