I marked this issue OT because i think is a conceptual issue and not related to any application per se.
I have 2 main issues with concurrency, one class is a queue public class Queue { private static org.apache.log4j.Logger log = Logger.getLogger(Queue.class); private Command command; private boolean valueSet = false; public synchronized void put(Command c) { if (valueSet) { try { wait(); } catch (InterruptedException ie) { } } this.command = c; log.info("put : "+c.getCommand()); valueSet = true; notify(); } public synchronized Command get() { if (!valueSet) { try { wait(); } catch (InterruptedException ie) { } } valueSet = false; notify(); log.info("get : "+this.command.getCommand()); return command; } } Then i have 1 class that reads and execute the command property. only one. Also, i have n classes trying constantly to "put" commands in the queue. Usually it works ok, but i have situations like this [xcall3] 2011-08-21 11:04:00,589 INFO Queue:39 - get : list trunk [xcall3] 2011-08-21 11:04:00,589 INFO Queue:24 - put : list agent-loginID [xcall3] 2011-08-21 11:04:00,589 INFO Queue:24 - put : list bcms agent 5116 day list agent-loginID get lost and never is executed. all clases trying to put uses the same code new Producer(Queue q, Command c).start(); and public class Producer extends Thread { private static org.apache.log4j.Logger log = Logger.getLogger(Producer.class); private Queue q; private Command c; public Producer(Queue q, Command c) { this.q = q; this.c = c; } @Override public void run() { try { while (true) { q.put(c); break; } } catch (Exception e) { log.error(c.getCommand()); } finally { } } } The second issue is, when the webapp is running, beside this problem, everything goes ok, but when i call to stop the thread that "gets" from queue, the last command is executed once again. So, the Consumer class, reach a wait on get operation because there's no command to execute, but when i interrupt this consumer class, get returns the last command stored in the queue. a clue? Thanks in advance.