并发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();
}
}