concurrency - Active Object Pattern in Concurrent Java 1.5+ -


i trying develop active object pattern in concurrent java using java.util.concurrent classes.

i describe using client , server. sample server as:

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);                 }   }  } 

and sample client:

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);   }  } 

and sample message encapsulation is:

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) {}   }  } 

and sample running code:

server s = new server(); client c = new client (s); s.init(); c.dosomething(); 

i dropped implementation details message across.

now, problem when in server state true incoming message should wait , await called on current message. however, illegalmonitorstateexception means current message not own current thread await on it. but, believe strange since current message gets called in server , thread pool current message has access current thread of execution.

i'd thankful ideas or suggestions, or known working implementation of pattern using java.util.concurrent. in advance.

update:
discussed solution deploy in blog post. hope help.

you have acquire lock when await on corresponding condition. without lock cannot associate condition directly. demonstrate this:

  public void await() {     lock.lock();     try {       condition.await();     } catch(exception e) {}     finally{       lock.unlock();     }   } 

that should resolve illegalmonitorstateexception

on side note of correctness should release lock in try{ } finally{ } manner, can observe wrote example. reason if exception occurs between lock().lock(); , super.run(); lock.unlock() never called.


Comments

Popular posts from this blog

c# - How to set Z index when using WPF DrawingContext? -

razor - Is this a bug in WebMatrix PageData? -

visual c++ - Using relative values in array sorting ( asm ) -