mikeyP
mikeyP

Reputation: 231

Stopping a specific java thread

I have a button "addCashier" which is creating a thread called "Cashier" now this thread is just simply generating orders every 4 seconds, a while(true) loop in the run() method of the thread. All is good there, but now I want to add a button to simulate cashiers logging off. I added a boolean variable to my while loop onDuty and a public function logOff() which sets this onDuty bool to false to get me out of the run's while loop. My problem now is from my gui class how can I call a function on a specific thread? Each cashier thread has been generated at runtime so I don't know their names.

I hope I made sense. Thanks in advance.

Upvotes: 2

Views: 17350

Answers (4)

PC.
PC.

Reputation: 7024

You can keep a reference of the Thread object somewhere so that u can call threadObj.logOff()

If you are not willing to do that then while creating a thred u can assign a unique name to the thread.

public void run ()
{
    this.setName(strCashireID);
    ......
}

At runtime, u can get the thread by:

Thread getThread(String strCashireID) {
   ThreadGroup threadGroup = Thread.currentThread( ).getThreadGroup( );
   Threads[] threads = new Thread[ threadGroup.activeCount() ];
   threadGroup.enumerate(threads);
   for (int nIndex=0; nIndex<threads.length; nIndex++) {
      if(threads[nIndex] != null && threads.getName().equals(strCashireID) {
         return threads[nIndex];
      }
   }
   return null;
}

I'll still suggest that u store the thread objects in a hash map instead of enumerating them at runtime.

Upvotes: 1

Vivek Viswanathan
Vivek Viswanathan

Reputation: 1963

If collecting the reference to all the threads is a problem, One other way could be having a public static synchronized HashMap that has the threadId(random number assigned at runtime to each thread) as the key and the boolean as the value. You can modify the while loop to pick the corresponding boolean value from this centralized Map. This would let you log-off a particular cashier.

Upvotes: 1

Bhaskar
Bhaskar

Reputation: 7523

You can store each thread's reference into a HashMap - along with its id or Name as the key. Later when you want to deal with one particular Cashier thread , use the Name or id to fetch the corresponding Thread from the HashMap and call the appropriate logOff() method on it.

Upvotes: 1

Tomasz Nurkiewicz
Tomasz Nurkiewicz

Reputation: 341003

Thread t = CashierThread();  //keep the reference to thread somewhere...

Now instead of a boolean property use built-in interrupted flag:

public void run() {
  while(!Thread.currentThread().isInterrupted()) {
    //...
  }
}

When you want to turn of the thread by clicking on a button simply call:

t.interrupt();

Of course you need to have access to t variable from the client code.

Upvotes: 10

Related Questions