tomcat-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Alexis Fidalgo [voiceovernetinc]" <alz...@gmail.com>
Subject Re: OT: help with concurrency issue
Date Sun, 21 Aug 2011 15:13:02 GMT
forget it, fixed. thanks again


On Aug 21, 2011, at 12:06 PM, alexis wrote:

> 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 <alzrck@gmail.com> 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: users-unsubscribe@tomcat.apache.org
>> For additional commands, e-mail: users-help@tomcat.apache.org
>> 
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org


Mime
View raw message