Re: persistent synchronization signal?
Tom Forsmo wrote:
Hi
I am working on a server where a request is divided into some paralell
tasks. The tasks have to complete in the correct order, even though its
paralellised. For example, task A and B can start at the same time, but
B can not complete until A is completed, since the last part of B
depends on A's succesfull completion. So I am wondering how can A signal
B abouts its completion. The problem here is twofold 1) that A completes
in only 10-20% of the time of B and 2) that B is the receiver of the
signal sent by A. If I use wait/notify, A will notify long before B has
even gotten to the wait call.
So my question is, does anybody know if there exists a signaling method
that stores a notify signal even though a wait is not yet issued?
I could use some sort of a message queue or even implement a simple
stored_notify_flag()/wait() class myself, but maybe there is another way
of doing it.
Any suggestions?
regards
tom
If B requires the result of A, you might look into Future<T> and Executors.
The Java concurrency packages have very useful tools for exactly the
thing you want to do.
Here's a short example:
<SSCCE>
import java.util.concurrent.*;
class ResultA {}
class ResultB {}
class TaskA implements Callable<ResultA> {
public ResultA call() {return new ResultA();}
}
class TaskB implements Callable<ResultB> {
Future<ResultA> futureResult;
public TaskB(Future<ResultA> futureResult) {
this.futureResult = futureResult;
}
public ResultB call() throws Exception {
doSomeStuff();
ResultA resultA = futureResult.get();
doSomeStuffWith(resultA);
return createResultB();
}
private ResultB createResultB() {return new ResultB();}
private void doSomeStuff() {}
private void doSomeStuffWith(ResultA resultA) {}
}
public class Main {
public static void main(String...args) throws Exception {
ExecutorService executor = Executors.newCachedThreadPool();
Future<ResultA> futureA = executor.submit(new TaskA());
Future<ResultB> futureB = executor.submit(new TaskB(futureA));
futureB.get();
}
}
</SSCCE>
You should probably read more about concurrency in Java. There are some
good tutorials. There is also an excellent book called Java Concurrency
In Practice
<http://virtualinfinity.net/wordpress/technical-book-recommendations/java-concurrency-in-practice/>
I suggest reading at *least* one of the above.
Hope this helps, and good luck.
--
Daniel Pitts' Tech Blog: <http://virtualinfinity.net/wordpress/>