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.



Reply via email to