并发Java 1.5+;

并发Java 1.5+;,java,concurrency,concurrent-programming,java.util.concurrent,Java,Concurrency,Concurrent Programming,Java.util.concurrent,我正在尝试使用Java.util.concurrent类在并发Java中开发 我使用客户端和服务器来描述它。示例服务器如下所示: class Server implements Runnable { public final LinkedBlockingQueue que = new LinkedBlockingQueue(); private final ExecutorService es = Executors.newCachedThreadPool(); private Me

我正在尝试使用
Java.util.concurrent
类在并发Java中开发

我使用
客户端
服务器
来描述它。示例
服务器
如下所示:

class Server implements Runnable {
  public final LinkedBlockingQueue que = new LinkedBlockingQueue();
  private final ExecutorService es = Executors.newCachedThreadPool();
  private Message currentMessage;

  private boolean state = false;

  public init() {
    es.submit(this);
  }

  public void requestForServer() {
    if (state) {
      this.currentMessage.await();
    }
    state = true;
  }

  public void run() {
     for(;;) {
       Message m = que.take();
       this.currentMessage = m;
       this.es.submit(m);           
     }
  }

}
和一个示例
客户端

class Client {

  private Server server;

  public Client(Server s) {
    this.server = s;
  }

  public void doSomething() {
    Message m = new Message(new Callable() {
      public Object call() {
        server.requestForServer();
      }
    });
    this.server.que.add(m);
  }

}
示例
消息
封装为:

class Message<V> extends FutureTask<V> {
  private Lock lock = new ReentrantLock();
  private Condition condition = new Condition();

  public Message(Callable<V> callable) {
    super(callable);
  }

  public void run() {
    try {
      lock.lock();
      super.run();
      lock.unlock();
    } catch(Exception e) {}
  }

  public void await() {
    try {
      condition.await();
    } catch(Exception e) {}
  }

  public void signal() {
    try {
      condition.signalAll();
    } catch(Exception e) {}
  }

}
我删除了一些实现细节,以便让大家了解我的信息。

现在,问题是当在
Server
状态
true
时,传入消息应该等待,并且对当前消息调用
wait
。但是,我得到了
IllegalMonitorStateException
,这意味着当前消息并不拥有要等待它的当前线程。但是,我认为这很奇怪,因为当前消息在
服务器及其线程池中被调用,因此当前消息也可以访问当前执行线程

如果有任何想法或建议,或者使用
java.util.concurrent
实现此模式,我将不胜感激。提前谢谢

更新

我在本文中讨论了可以部署的解决方案。我希望它能有所帮助。

在等待相应条件时,您必须实际获取锁。如果没有该锁,则无法将自己与条件直接关联。为了证明这一点:

  public void await() {
    lock.lock();
    try {
      condition.await();
    } catch(Exception e) {}
    finally{
      lock.unlock();
    }
  }
这将解决您的非法监视器状态异常


在正确性方面,您应该始终以try{}finally{}的方式释放锁,您可以观察我作为示例编写的内容。原因是
lock().lock()之间发生异常
super.run()
lock.unlock()
将永远不会被调用

@john-v谢谢你的回复。但是,这并不能解决问题,我认为不这样做是有意义的,因为这个想法只是替换了锁定的位置。@Berooz您仍然得到非法的MonitorStateException还是得到了其他一些异常?
  public void await() {
    lock.lock();
    try {
      condition.await();
    } catch(Exception e) {}
    finally{
      lock.unlock();
    }
  }