public abstract class FXSync
extends java.lang.Object
implements java.lang.Runnable
Platform.runLater(java.lang.Runnable)
.
StringBuilder sb = new StringBuilder("Moje aplikace");
if (userLogged()) sb.append(": uživatel ").append(getUsreName());
// stage.setTitle(sb.toString()) nelze zde použít přímo
Platform.invokeLater(() -> stage.setTitle(sb.toString()));
Obvykle nám stačí vědomí, že "někdy potom" se kód spustí, jindy ale
potřebujeme pokračovat, až když je kód provedený FXAT vláknem dokončen.
Bohužel Platform
neposkytuje metodu runLaterAndWait()
veřejně
(podobná metoda je v
SwingUtilities.invokeAndWait(java.lang.Runnable)
).
A to je právě prostor pro tuto třídu. Tu lze používat staticky (podobně jako
Platform
) i objektově (implementováním metody call()
.
Constructor and Description |
---|
FXSync()
Vytvoří instanci synchornizačního zámku.
|
Modifier and Type | Method and Description |
---|---|
void |
await()
Čeká na uvolnění zámku (voláno volajícím vláknem).
|
boolean |
await(long timeout,
java.util.concurrent.TimeUnit unit)
Čeká na uvolnění zámku (voláno volajícím vláknem).
|
protected abstract boolean |
call()
Kód, který se má provést volaný FXAT vláknem.
|
void |
done()
Signalizace dokončení akce (voláno FXAT vláknem).
|
java.lang.Runnable |
finished()
Signalizace dokončení akce (voláno FXAT vláknem).
|
void |
run() |
static void |
runInFx(java.lang.Runnable run)
Spustí poskytnutý kód v FXAT vlákně bez ohledu na to, z jakého vlákna je
metoda spuštěna.
|
static <T> T |
runInFx(T obj,
java.util.function.Consumer<T> run)
Spustí poskytnutý kód v FXAT vlákně bez ohledu na to, z jakého vlákna je
metoda spuštěna.
|
static void |
runLaterAndWait(java.lang.Runnable run)
Spustí poskytnutý kód v FXAT vlákně a vrátí se, až je kód dokončen.
|
public FXSync() throws java.lang.IllegalStateException
Platform.runLater(java.lang.Runnable)
) a počkat na jeho
uvolnění.java.lang.IllegalStateException
- při spuštění v FXAT vlákněpublic static void runLaterAndWait(java.lang.Runnable run) throws java.lang.IllegalStateException
Tuto metodu z principu nelze volat z FXAT vlákna. Pokud
je potřeba spustit nějaký kód v FXAT z neznámeho vlákna, může posloužit
metoda runInFx(java.lang.Runnable)
.
run
- spouštěný kódjava.lang.IllegalStateException
- pokud je metoda spuštěna FXAT vláknem, nebo
pokud naopak správným vláknem v situaci, že FXAT ještě nebylo
inicializováno; bohužel není možné zjistit, zda FXAT vlákno již bylo
ukončeno, v takovém případě dojde k uváznutí.public static void runInFx(java.lang.Runnable run) throws java.lang.IllegalStateException
runLaterAndWait(java.lang.Runnable)
. Tato metoda
nevrací žádnou hodnotu, jen čeká na dokončení. Pokud je potřeba předat
volanému parametr, může posloužit
runInFx(java.lang.Object, java.util.function.Consumer)
.run
- spouštěný kódjava.lang.IllegalStateException
- pokud ještě nebylo FXAT inicializováno
(např. spuštěním FX aplikace)public static <T> T runInFx(T obj, java.util.function.Consumer<T> run) throws java.lang.IllegalStateException
runLaterAndWait(java.lang.Runnable)
. Tato metoda
vrací hodnotu zadanou jako první parametr, aby na ní bylo možné aplikovat
techniku zřetězení metod. Tento parametr rovněž předá volanému kódu.T
- typový parametr předaného referenčního objektu (rovněž typ
návratové hodnty)obj
- referenční objekt, nejprve bude předán spouštěnému kód,
následně vrácen metodourun
- spouštěný kódjava.lang.IllegalStateException
- pokud ještě nebylo FXAT inicializováno
(např. spuštěním FX aplikace)public final void run()
run
in interface java.lang.Runnable
public final void await()
await(long, java.util.concurrent.TimeUnit)
.CountDownLatch.await()
public final boolean await(long timeout, java.util.concurrent.TimeUnit unit)
false
.timeout
- doba, jak dlouho bude volající vlákno čekat na odemknutíunit
- časová jednotka odpovídající hodnotětrue
, pokud byla práce dokončena, false
, pokud
ani po uplynutí poskytnuté doby nedošlo k úspěšnému dokončenípublic final void done()
finished()
public final java.lang.Runnable finished()
onXXXFinished
handlery událostí).done()
protected abstract boolean call()
true
, pokud vše proběhlo správně a je třeba signalizovat
dokončení, pokud false
, signalizace se neprovede (možná už se
provedla uvnitř kódu, možná se provede později jako reakce na asynchronní
událost)