Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Java (http://www.velocityreviews.com/forums/f30-java.html)
-   -   blocking calls in java (http://www.velocityreviews.com/forums/t143123-blocking-calls-in-java.html)

Gyro 04-29-2005 12:22 PM

blocking calls in java
 
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 ?

Daniel Dyer 04-29-2005 12:52 PM

Re: blocking calls in java
 
On Fri, 29 Apr 2005 13:22:16 +0100, Gyro <appcoder@softhome.net> wrote:

> 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.

--
Daniel Dyer
http://www.footballpredictions.net

Daniel Dyer 04-29-2005 12:56 PM

Re: blocking calls in java
 
On Fri, 29 Apr 2005 13:52:23 +0100, Daniel Dyer
<dan@footballnospamformepleasepredictions.net> wrote:

> private volatile flag = false;


That should be:

private volatile boolean flag = false;

Dan.


--
Daniel Dyer
http://www.footballpredictions.net


All times are GMT. The time now is 06:42 AM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.