blocking calls in java

G

Gyro

Hello, I need to block current thread, waiting for flag/event. Plz give advice.

My attempts:

public synchronized void blockingFormCreate() {
createAndShowForm(); // Create and show screen form
wait(); // Fall asleep
. . .
}

public synchronized void setEvent() {
notify(); // wakeup, continue processing
}


volatile boolean event; // field

private void blockingFormCreate() {
event = false;
createAndShowForm(); // Make a form
for(; !flag; yield()) ; // Blocking
. . .
}

where I`m correct/incorrect ?
 
D

Daniel Dyer

Hello, I need to block current thread, waiting for flag/event. Plz give
advice.
....

where I`m correct/incorrect ?

Generally you should call wait in a loop (the thread may be notified
before you want wait to return). You should usually call notifyAll rather
than notify, unless you have a good reason not to. A thread must own an
object's monitor to call wait or notify, so you need to synchronize these
calls (not necessarily the whole method, but you need to make sure the
flag does not change between the evaluation of the while condition and the
call to wait).

This should work:


private volatile flag = false;

public synchronized void blockingCall()
{
while (!flag) // Loop so this method doesn't return before the flag is
true.
{
try
{
wait();
}
catch (InterruptedException ex)
{
// Ignore and loop again until the flag is true.
}
}
}


/**
* Call this from another thread while the above method is blocking
* to make it return.
*/
public synchronized void unblock()
{
flag = true;
notifyAll();
}


Dan.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,054
Latest member
TrimKetoBoost

Latest Threads

Top