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中将对象放入优先级队列后等待它们_Java_Multithreading - Fatal编程技术网

在Java中将对象放入优先级队列后等待它们

在Java中将对象放入优先级队列后等待它们,java,multithreading,Java,Multithreading,我试图用多线程技术解决Java中的读写器偏好问题。下面是我的代码的精简版本。行吗 public PriorityBlockingQueue<myClass> pq; public void foo(){ myClass obj = new myClass(); pq.add(obj); obj.wait(); //Actual code } public void bar(){ pq.remove().notify(); } 假设优先级队列p

我试图用多线程技术解决Java中的读写器偏好问题。下面是我的代码的精简版本。行吗

public PriorityBlockingQueue<myClass> pq;
public void foo(){
    myClass obj = new myClass();
    pq.add(obj);
    obj.wait();
    //Actual code
}
public void bar(){
    pq.remove().notify();
}

假设优先级队列pq最初为空,并且封闭类的构造函数调用pq的构造函数。此外,foo首先由一个线程调用,然后由另一个线程调用bar。因此,当调用foo时,它会将obj添加到队列中,并成为前面的元素,因此当在bar中调用remove时,它就是被移除的元素。我的问题是,实际的代码会被执行吗?还是我在两个完全不同的对象上执行等待和通知?如果是这样的话,我如何修复它呢?

我看到的主要问题是线程可能会错误地醒来。。。因此,您应该始终拥有一些与条件相关的数据。此外,notifyAll不太可能导致死锁。。。因此:

public void foo() {
     MyClass obj = new MyClass();
     pq.add(obj);
     synchronized(obj) {
         while (!obj.isDoneBeingProcessed()) {
             obj.wait();
         }
      }
 }

 public void bar() {
      MyClass next = pq.remove();
      if (!next) {
          return;
      }
      next.doProcessing();
      synchronized(next) {
          next.setDone(true);
          next.notifyAll();
      }
 }

但是请注意,这段代码实际上没有意义,因为它本质上序列化了整个计算。如果您将所有内容都排在一个线程中,而在另一个线程中进行处理,然后。。。只有在最后或在另一个线程中尝试等待所有内容。在生成所有内容之前,将等待放在生成器阶段可以有效地序列化整个计算。

为简单起见,只需假设每个线程有一个线程。这更多的是一个问题,即在将对象添加到优先级队列之后,是否能够等待该对象,以便稍后将其删除并通知。我的问题实际上是一个很大的问题。我有两个优先队列,一个是读者队列,一个是作者队列。有一些特定的政策允许读者和作者在任何特定的时间点进入。每个优先级队列由请求对象组成,每个对象仅由一个成员int priority组成。在执行requestobject.wait之前,假设已有读卡器或写卡器正在使用资源,我希望将请求对象添加到优先级队列中,以便稍后由最后一个读卡器或写卡器线程通知请求。我收到非法监视器状态异常。这似乎是一个重复的问题。。。我的代码给了我一个错误,因为我没有在正确的对象上使用同步块。我必须仔细阅读synchronize,然后才能理解为什么要使用它。谢谢