I’m writing a listener thread for a server, and at the moment I’m using:
while (true){ try { if (condition){ //do something condition=false; } sleep(1000); } catch (InterruptedException ex){ Logger.getLogger(server.class.getName()).log(Level.SEVERE, null, ex); } }
With the code above, I’m running into issues with the run function eating all the cpu time looping. The sleep function works, but it seems be a makeshift fix, not a solution.
Is there some function which would block until the variable ‘condition’ became ‘true’? Or is continual looping the standard method of waiting until a variable’s value changes?
Advertisement
Answer
Polling like this is definitely the least preferred solution.
I assume that you have another thread that will do something to make the condition true. There are several ways to synchronize threads. The easiest one in your case would be a notification via an Object:
Main thread:
synchronized(syncObject) { try { // Calling wait() will block this thread until another thread // calls notify() on the object. syncObject.wait(); } catch (InterruptedException e) { // Happens if someone interrupts your thread. } }
Other thread:
// Do something // If the condition is true, do the following: synchronized(syncObject) { syncObject.notify(); }
syncObject
itself can be a simple Object
.
There are many other ways of inter-thread communication, but which one to use depends on what precisely you’re doing.