better, concurrency issue is gone, facing a new one, i cannot stop the Consumer
thread, i have this
@Override
public void run() {
dao = (DAO) sc.getAttribute("dao");
try {
q = (Queue) sc.getAttribute("Queue");
while (keepRunning) {
Command c = q.get();
doExec dE = new doExec(c);
if (!dE.isAlive()) {
dE.start();
dE.join();
}
Thread.sleep(1500);
}
where keepRunning is a volatile boolean that i set to false when i try to end
this Thread. so when i try to stop the consumer i call a method that sets the
volatile to false, and then i call an interrupt. Resuming
to start
Consumer c = new Comsumer();
if(!c.isAlive())
c.start();
to stop
if(c.isAlive())
{
c.doStop(); //this turn keepRunning to false
c.interrupt();
while(c.isAlive())
{
log.info("Waiting for consumer to stop"); //now im facing a loop here, consumer
never stops
}
}
On Aug 21, 2011, at 11:49 AM, Felix Schumacher wrote:
>
>
> alexis <[email protected]> schrieb:
>
>> 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 while instead of if.
>> try {
>> wait();
>> } catch (InterruptedException ie) {
>> }
>> }
>> this.command = c;
>>
>> log.info("put : "+c.getCommand());
>> valueSet = true;
>> notify();
>> }
>>
>> public synchronized Command get() {
>> if (!valueSet) {
> Again, use while, not if.
>> try {
>> wait();
>> } catch (InterruptedException ie) {
>> }
>> }
>> valueSet = false;
>> notify();
>>
>> log.info("get : "+this.command.getCommand());
>> return command;
>> }
>> }
>>
>>
> Regards
> Felix
>> 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.
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]