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 <[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]
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]