Package com.stata.sfi
Annotation Type SynchronizedOnMain
Indicates that a method or class is thread-safe and that thread safety has
been provided using the Java keyword synchronized; execution may be forced
back on the main thread, so care must be taken to prevent deadlocks. For
example, if a worker thread calls a
SynchronizedOnMain
method while
the main thread has been blocked, a deadlock will occur.
Example:
This example shows how to handle and prevent a potential deadlock when using
a method marked with SynchronizedOnMain
in a parallel stream.
public static int simpleExample(String args[]) {
final int count = Integer.parseInt(args[0]);
String label = args[1];
Thread t1 = new Thread(() -> {
IntStream.range(1, count).parallel().forEach(n -> {
// IMPORTANT: A WORKER THREAD IS NEEDED BECAUSE
// SFIToolkit.displayln() runs on the main thread
// (SynchronizedOnMain) and since the stream
// waits/blocks the main thread a deadlock would
// otherwise occur.
SFIToolkit.displayln(label + n);
});
});
// start the thread; wait for thread to finish before we exit plugin
t1.start();
while (t1.isAlive()) {
try {
Thread.sleep(10);
SFIToolkit.pollnow();
} catch (InterruptedException e) {}
}
SFIToolkit.displayln(" ... done");
return 0;
}
From Stata...
. javacall Examples simpleExample, args(100 "counting: ") jar(examples.jar)