代码之家  ›  专栏  ›  技术社区  ›  Anand

Java中对象放入优先级队列后的等待

  •  1
  • Anand  · 技术社区  · 15 年前

    我试图用多线程技术解决Java中带有writer偏好的readers-writer问题。下面是我的代码的精简版本。能用吗?

    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首先由一个线程调用,然后由另一个线程调用。因此,当调用foo时,它会将obj添加到队列中,而obj将成为前元素,因此当在bar中调用remove时,这就是被删除的元素。我的问题是,“实际代码”会被执行吗?或者我是在两个完全不同的对象上执行wait()和notify()呢?如果是的话,我该怎么解决?

    1 回复  |  直到 15 年前
        1
  •  0
  •   Michael Aaron Safyan    15 年前

    我看到的主要问题是线程可能会被错误唤醒。。。所以你应该总是有一些与条件相关的数据。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();
          }
     }