Am Sonntag, den 21.08.2011, 12:13 -0300 schrieb Alexis Fidalgo [voiceovernetinc]: > forget it, fixed. thanks again Even though. Have you had a look at the package java.util.concurrent? In there are blocking queues and executor services, like the one you are trying to write :)
Regards Felix > > > 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 <alz...@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-unsubscr...@tomcat.apache.org > >> For additional commands, e-mail: users-h...@tomcat.apache.org > >> > > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org > For additional commands, e-mail: users-h...@tomcat.apache.org > --------------------------------------------------------------------- To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org