public class SPU
extends java.lang.Object
This class solves a complex architectural problem in Swing: manipulating GUI objects (which must happen on the EDT) while performing logic or data operations in background threads, without losing the sequential integrity of the operations.
Standard Swing approaches often lead to deadlocks (calling `invokeAndWait` from EDT) or race conditions (firing background tasks that finish out of order). This utility normalizes the API so that scripts and logic can look the same regardless of whether they are currently running on or off the EDT, and ensures that tasks for a specific component sequence correctly.
The core concept of SPU is the qid (Queue ID).
qid (usually a specific UI Component).qid. This ensures their tasks are
serialized in a single queue.
qid are guaranteed to be "managed" together.qid is null, the task is treated as independent and executed immediately/concurrently.// Fire and forget in background SPU.offEDTv(myComponent, () -> performHeavyCalculation()); // Calculate in background, then update UI (Chaining) SPU.offEDT(myComponent, () -> calculateData()) .thenAccept(data -> SPU.onEDTv(myComponent, () -> updateUI(data))); // Blocking call from a button action (Safe usage) SPU.offEDTAndWait(myComponent, () -> saveToDb()); // Won't freeze UI repaints due to SecondaryLoop usage
See Tasklet on how to enable async stacktrace support (at the cost of performance).
Please note that while testing this class without an actual GUI, the secondary EDT might be shut down eagerly,
failing actually any test for onEDTAndWait.
The best way to avoid this is to create a javax.swing.Timer with a timeout < 1000ms.
(See SPUTest for examples).
Runnable/Consumer).SecondaryLoop).| Modifier and Type | Field and Description |
|---|---|
static int |
MAX_SCHEDULE_PER_QID
Controls the parallelism allowed for off-EDT tasks sharing the same QID.
|
| Modifier and Type | Method and Description |
|---|---|
static <T,U,R> R |
compute(java.util.function.BiFunction<T,U,R> func,
T t,
U u) |
static <T> T |
compute(java.util.concurrent.Callable<T> c) |
static <T,R> R |
compute(java.util.function.Function<T,R> func,
T t) |
static <T,U,V,W,R> |
compute(QuadFunction<T,U,V,W,R> func,
T t,
U u,
V v,
W w) |
static <T,U,V,R> R |
compute(TriFunction<T,U,V,R> func,
T t,
U u,
V v) |
static <T> java.util.concurrent.CompletableFuture<java.lang.Void> |
delayOnEDT(int delay,
java.util.concurrent.TimeUnit unit,
java.lang.Object qid,
java.util.function.Consumer<T> func,
T t)
Delays execution of a task on the EDT.
|
static java.util.concurrent.CompletableFuture<java.lang.Void> |
delayOnEDT(int delay,
java.util.concurrent.TimeUnit unit,
java.lang.Object qid,
java.lang.Runnable func) |
static void |
ensureEDT()
Ensures that the current thread is the Event Dispatch Thread (EDT).
|
static void |
ensureOutsideEDT()
Ensures that the current thread is NOT the Event Dispatch Thread (EDT).
|
static <T> java.util.concurrent.Future<T> |
fork(java.util.concurrent.Callable<T> c)
Submits a Callable to the internal SPU pool.
|
static java.util.concurrent.Future<java.lang.Void> |
forkv(java.lang.Runnable r)
Submits a Runnable to the internal SPU pool.
|
static <T,R> boolean |
invokeAndWaitIfNotOnEDT(java.lang.Object qid,
java.util.function.Function<T,R> func,
T t) |
static boolean |
invokeAndWaitIfNotOnEDT(java.lang.Object qid,
java.lang.Runnable func)
Safely ensures logic runs on the EDT.
|
static boolean |
isEDT()
Utility check to determine if the current thread is the Swing Event Dispatch Thread (EDT).
|
static boolean |
isNestedEDT()
Checks whether the current execution flow is running inside a nested Event Dispatch Thread (EDT) loop.
|
static void |
needsEDT()
Assertion helper.
|
static <T,U,R> java.util.concurrent.CompletableFuture<R> |
offEDT(java.lang.Object qid,
java.util.function.BiFunction<T,U,R> func,
T t,
U u)
Asynchronously executes a BiFunction on a background thread.
|
static <R> java.util.concurrent.CompletableFuture<R> |
offEDT(java.lang.Object qid,
java.util.concurrent.Callable<R> func)
Asynchronously executes a Callable on a background thread.
|
static java.util.concurrent.CompletableFuture<?> |
offEDT(java.lang.Object qid,
java.lang.Class<?> cl,
java.lang.String mname,
java.lang.Object[] args,
java.lang.Class<?>[] argtypes) |
static <T,R> java.util.concurrent.CompletableFuture<R> |
offEDT(java.lang.Object qid,
java.util.function.Function<T,R> func,
T t)
Asynchronously executes a Function on a background thread.
|
static <T,U,V,W,X,Y,Z,A,B,C,R> |
offEDT(java.lang.Object qid,
Function10<T,U,V,W,X,Y,Z,A,B,C,R> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z,
A a,
B b,
C c) |
static <T,U,V,W,X,R> |
offEDT(java.lang.Object qid,
Function5<T,U,V,W,X,R> func,
T t,
U u,
V v,
W w,
X x) |
static <T,U,V,W,X,Y,R> |
offEDT(java.lang.Object qid,
Function6<T,U,V,W,X,Y,R> func,
T t,
U u,
V v,
W w,
X x,
Y y) |
static <T,U,V,W,X,Y,Z,R> |
offEDT(java.lang.Object qid,
Function7<T,U,V,W,X,Y,Z,R> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z) |
static <T,U,V,W,X,Y,Z,A,R> |
offEDT(java.lang.Object qid,
Function8<T,U,V,W,X,Y,Z,A,R> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z,
A a) |
static <T,U,V,W,X,Y,Z,A,B,R> |
offEDT(java.lang.Object qid,
Function9<T,U,V,W,X,Y,Z,A,B,R> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z,
A a,
B b) |
static java.util.concurrent.CompletableFuture<?> |
offEDT(java.lang.Object qid,
java.lang.Object o,
java.lang.String mname,
java.lang.Object[] args,
java.lang.Class<?>[] argtypes) |
static <T,U,V,W,R> |
offEDT(java.lang.Object qid,
QuadFunction<T,U,V,W,R> func,
T t,
U u,
V v,
W w) |
static <T,U,V,R> java.util.concurrent.CompletableFuture<R> |
offEDT(java.lang.Object qid,
TriFunction<T,U,V,R> func,
T t,
U u,
V v) |
static <T,U,R> R |
offEDTAndWait(java.lang.Object qid,
java.util.function.BiFunction<T,U,R> func,
T t,
U u) |
static <R> R |
offEDTAndWait(java.lang.Object qid,
java.util.concurrent.Callable<R> func)
Submits a Callable to run on a background thread and waits for its result.
|
static java.lang.Object |
offEDTAndWait(java.lang.Object qid,
java.lang.Class<?> cl,
java.lang.String m,
java.lang.Object[] args,
java.lang.Class<?>[] argtypes) |
static <T,R> R |
offEDTAndWait(java.lang.Object qid,
java.util.function.Function<T,R> func,
T t)
Submits a Function to run on a background thread and waits for its result.
|
static <T,U,V,W,X,Y,Z,A,B,C,R> |
offEDTAndWait(java.lang.Object qid,
Function10<T,U,V,W,X,Y,Z,A,B,C,R> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z,
A a,
B b,
C c) |
static <T,U,V,W,X,R> |
offEDTAndWait(java.lang.Object qid,
Function5<T,U,V,W,X,R> func,
T t,
U u,
V v,
W w,
X x) |
static <T,U,V,W,X,Y,R> |
offEDTAndWait(java.lang.Object qid,
Function6<T,U,V,W,X,Y,R> func,
T t,
U u,
V v,
W w,
X x,
Y y) |
static <T,U,V,W,X,Y,Z,R> |
offEDTAndWait(java.lang.Object qid,
Function7<T,U,V,W,X,Y,Z,R> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z) |
static <T,U,V,W,X,Y,Z,A,R> |
offEDTAndWait(java.lang.Object qid,
Function8<T,U,V,W,X,Y,Z,A,R> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z,
A a) |
static <T,U,V,W,X,Y,Z,A,B,R> |
offEDTAndWait(java.lang.Object qid,
Function9<T,U,V,W,X,Y,Z,A,B,R> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z,
A a,
B b) |
static java.lang.Object |
offEDTAndWait(java.lang.Object qid,
java.lang.Object o,
java.lang.String m,
java.lang.Object[] args,
java.lang.Class<?>[] argtypes) |
static <T,U,V,W,R> |
offEDTAndWait(java.lang.Object qid,
QuadFunction<T,U,V,W,R> func,
T t,
U u,
V v,
W w) |
static <T,U,V,R> R |
offEDTAndWait(java.lang.Object qid,
TriFunction<T,U,V,R> func,
T t,
U u,
V v) |
static <T,U> void |
offEDTAndWaitv(java.lang.Object qid,
java.util.function.BiConsumer<T,U> func,
T t,
U u)
Submits a BiConsumer to run on a background thread and waits for completion.
|
static <T> void |
offEDTAndWaitv(java.lang.Object qid,
java.util.function.Consumer<T> func,
T t)
Submits a Consumer to run on a background thread and waits for completion.
|
static <T,U,V,W,X,Y,Z,A,B,C,R> |
offEDTAndWaitv(java.lang.Object qid,
Consumer10<T,U,V,W,X,Y,Z,A,B,C> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z,
A a,
B b,
C c) |
static <T,U,V,W,X> |
offEDTAndWaitv(java.lang.Object qid,
Consumer5<T,U,V,W,X> func,
T t,
U u,
V v,
W w,
X x) |
static <T,U,V,W,X,Y> |
offEDTAndWaitv(java.lang.Object qid,
Consumer6<T,U,V,W,X,Y> func,
T t,
U u,
V v,
W w,
X x,
Y y) |
static <T,U,V,W,X,Y,Z> |
offEDTAndWaitv(java.lang.Object qid,
Consumer7<T,U,V,W,X,Y,Z> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z) |
static <T,U,V,W,X,Y,Z,A> |
offEDTAndWaitv(java.lang.Object qid,
Consumer8<T,U,V,W,X,Y,Z,A> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z,
A a) |
static <T,U,V,W,X,Y,Z,A,B,R> |
offEDTAndWaitv(java.lang.Object qid,
Consumer9<T,U,V,W,X,Y,Z,A,B> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z,
A a,
B b) |
static <T,U,V,W> void |
offEDTAndWaitv(java.lang.Object qid,
QuadConsumer<T,U,V,W> func,
T t,
U u,
V v,
W w) |
static void |
offEDTAndWaitv(java.lang.Object qid,
java.lang.Runnable func)
Submits a background task and waits for it to complete.
|
static <T,U,V> void |
offEDTAndWaitv(java.lang.Object qid,
TriConsumer<T,U,V> func,
T t,
U u,
V v) |
static <T,U> java.util.concurrent.CompletableFuture<java.lang.Void> |
offEDTv(java.lang.Object qid,
java.util.function.BiConsumer<T,U> func,
T t,
U u)
Asynchronously executes a BiConsumer on a background thread.
|
static <T> java.util.concurrent.CompletableFuture<java.lang.Void> |
offEDTv(java.lang.Object qid,
java.util.function.Consumer<T> func,
T t)
Asynchronously executes a Consumer on a background thread.
|
static <T,U,V,W,X> |
offEDTv(java.lang.Object qid,
Consumer5<T,U,V,W,X> func,
T t,
U u,
V v,
W w,
X x) |
static <T,U,V,W,X,Y> |
offEDTv(java.lang.Object qid,
Consumer6<T,U,V,W,X,Y> func,
T t,
U u,
V v,
W w,
X x,
Y y) |
static <T,U,V,W,X,Y,Z> |
offEDTv(java.lang.Object qid,
Consumer7<T,U,V,W,X,Y,Z> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z) |
static <T,U,V,W,X,Y,Z,A> |
offEDTv(java.lang.Object qid,
Consumer8<T,U,V,W,X,Y,Z,A> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z,
A a) |
static <T,U,V,W> java.util.concurrent.CompletableFuture<java.lang.Void> |
offEDTv(java.lang.Object qid,
QuadConsumer<T,U,V,W> func,
T t,
U u,
V v,
W w) |
static java.util.concurrent.CompletableFuture<java.lang.Void> |
offEDTv(java.lang.Object qid,
java.lang.Runnable func)
Asynchronously executes a Runnable on a background thread.
|
static <T,U,V> java.util.concurrent.CompletableFuture<java.lang.Void> |
offEDTv(java.lang.Object qid,
TriConsumer<T,U,V> func,
T t,
U u,
V v) |
static <T,U,R> java.util.concurrent.CompletableFuture<R> |
onEDT(java.lang.Object qid,
java.util.function.BiFunction<T,U,R> func,
T t,
U u)
Asynchronously executes a BiFunction on the EDT.
|
static <R> java.util.concurrent.CompletableFuture<R> |
onEDT(java.lang.Object qid,
java.util.concurrent.Callable<R> func)
Asynchronously executes a Callable on the EDT.
|
static java.util.concurrent.CompletableFuture<?> |
onEDT(java.lang.Object qid,
java.lang.Class<?> cl,
java.lang.String mname,
java.lang.Object[] args,
java.lang.Class<?>[] argtypes) |
static <T,R> java.util.concurrent.CompletableFuture<R> |
onEDT(java.lang.Object qid,
java.util.function.Function<T,R> func,
T t)
Asynchronously executes a Function on the EDT.
|
static <T,U,V,W,X,Y,Z,A,B,C,R> |
onEDT(java.lang.Object qid,
Function10<T,U,V,W,X,Y,Z,A,B,C,R> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z,
A a,
B b,
C c) |
static <T,U,V,W,X,R> |
onEDT(java.lang.Object qid,
Function5<T,U,V,W,X,R> func,
T t,
U u,
V v,
W w,
X x) |
static <T,U,V,W,X,Y,R> |
onEDT(java.lang.Object qid,
Function6<T,U,V,W,X,Y,R> func,
T t,
U u,
V v,
W w,
X x,
Y y) |
static <T,U,V,W,X,Y,Z,R> |
onEDT(java.lang.Object qid,
Function7<T,U,V,W,X,Y,Z,R> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z) |
static <T,U,V,W,X,Y,Z,A,R> |
onEDT(java.lang.Object qid,
Function8<T,U,V,W,X,Y,Z,A,R> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z,
A a) |
static <T,U,V,W,X,Y,Z,A,B,R> |
onEDT(java.lang.Object qid,
Function9<T,U,V,W,X,Y,Z,A,B,R> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z,
A a,
B b) |
static java.util.concurrent.CompletableFuture<?> |
onEDT(java.lang.Object qid,
java.lang.Object o,
java.lang.String mname,
java.lang.Object[] args,
java.lang.Class<?>[] argtypes) |
static <T,U,V,W,R> |
onEDT(java.lang.Object qid,
QuadFunction<T,U,V,W,R> func,
T t,
U u,
V v,
W w) |
static <T,U,V,R> java.util.concurrent.CompletableFuture<R> |
onEDT(java.lang.Object qid,
TriFunction<T,U,V,R> func,
T t,
U u,
V v) |
static <T,U,R> R |
onEDTAndWait(java.lang.Object qid,
java.util.function.BiFunction<T,U,R> func,
T t,
U u) |
static <R> R |
onEDTAndWait(java.lang.Object qid,
java.util.concurrent.Callable<R> func)
Submits a Callable to run on the EDT and waits for its result.
|
static java.lang.Object |
onEDTAndWait(java.lang.Object qid,
java.lang.Class<?> cl,
java.lang.String m,
java.lang.Object[] args,
java.lang.Class<?>[] argtypes) |
static <T,R> R |
onEDTAndWait(java.lang.Object qid,
java.util.function.Function<T,R> func,
T t)
Submits a Function to run on the EDT and waits for its result.
|
static <T,U,V,W,X,Y,Z,A,B,C,R> |
onEDTAndWait(java.lang.Object qid,
Function10<T,U,V,W,X,Y,Z,A,B,C,R> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z,
A a,
B b,
C c) |
static <T,U,V,W,X,R> |
onEDTAndWait(java.lang.Object qid,
Function5<T,U,V,W,X,R> func,
T t,
U u,
V v,
W w,
X x) |
static <T,U,V,W,X,Y,R> |
onEDTAndWait(java.lang.Object qid,
Function6<T,U,V,W,X,Y,R> func,
T t,
U u,
V v,
W w,
X x,
Y y) |
static <T,U,V,W,X,Y,Z,R> |
onEDTAndWait(java.lang.Object qid,
Function7<T,U,V,W,X,Y,Z,R> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z) |
static <T,U,V,W,X,Y,Z,A,R> |
onEDTAndWait(java.lang.Object qid,
Function8<T,U,V,W,X,Y,Z,A,R> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z,
A a) |
static <T,U,V,W,X,Y,Z,A,B,R> |
onEDTAndWait(java.lang.Object qid,
Function9<T,U,V,W,X,Y,Z,A,B,R> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z,
A a,
B b) |
static java.lang.Object |
onEDTAndWait(java.lang.Object qid,
java.lang.Object o,
java.lang.String m,
java.lang.Object[] args,
java.lang.Class<?>[] argtypes) |
static <T,U,V,W,R> |
onEDTAndWait(java.lang.Object qid,
QuadFunction<T,U,V,W,R> func,
T t,
U u,
V v,
W w) |
static <T,U,V,R> R |
onEDTAndWait(java.lang.Object qid,
TriFunction<T,U,V,R> func,
T t,
U u,
V v) |
static <T,U> void |
onEDTAndWaitv(java.lang.Object qid,
java.util.function.BiConsumer<T,U> func,
T t,
U u)
Submits a BiConsumer to run on the EDT and waits for completion.
|
static <T> void |
onEDTAndWaitv(java.lang.Object qid,
java.util.function.Consumer<T> func,
T t)
Submits a Consumer to run on the EDT and waits for completion.
|
static <T,U,V,W,X,Y,Z,A,B,C,R> |
onEDTAndWaitv(java.lang.Object qid,
Consumer10<T,U,V,W,X,Y,Z,A,B,C> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z,
A a,
B b,
C c) |
static <T,U,V,W,X> |
onEDTAndWaitv(java.lang.Object qid,
Consumer5<T,U,V,W,X> func,
T t,
U u,
V v,
W w,
X x) |
static <T,U,V,W,X,Y> |
onEDTAndWaitv(java.lang.Object qid,
Consumer6<T,U,V,W,X,Y> func,
T t,
U u,
V v,
W w,
X x,
Y y) |
static <T,U,V,W,X,Y,Z> |
onEDTAndWaitv(java.lang.Object qid,
Consumer7<T,U,V,W,X,Y,Z> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z) |
static <T,U,V,W,X,Y,Z,A> |
onEDTAndWaitv(java.lang.Object qid,
Consumer8<T,U,V,W,X,Y,Z,A> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z,
A a) |
static <T,U,V,W,X,Y,Z,A,B,R> |
onEDTAndWaitv(java.lang.Object qid,
Consumer9<T,U,V,W,X,Y,Z,A,B> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z,
A a,
B b) |
static <T,U,V,W> void |
onEDTAndWaitv(java.lang.Object qid,
QuadConsumer<T,U,V,W> func,
T t,
U u,
V v,
W w) |
static void |
onEDTAndWaitv(java.lang.Object qid,
java.lang.Runnable func)
Submits an EDT task and waits for it to complete.
|
static <T,U,V> void |
onEDTAndWaitv(java.lang.Object qid,
TriConsumer<T,U,V> func,
T t,
U u,
V v) |
static <T,U> java.util.concurrent.CompletableFuture<java.lang.Void> |
onEDTv(java.lang.Object qid,
java.util.function.BiConsumer<T,U> func,
T t,
U u)
Asynchronously executes a BiConsumer on the EDT.
|
static <T> java.util.concurrent.CompletableFuture<java.lang.Void> |
onEDTv(java.lang.Object qid,
java.util.function.Consumer<T> func,
T t)
Asynchronously executes a Consumer on the EDT.
|
static <T,U,V,W,X> |
onEDTv(java.lang.Object qid,
Consumer5<T,U,V,W,X> func,
T t,
U u,
V v,
W w,
X x) |
static <T,U,V,W,X,Y> |
onEDTv(java.lang.Object qid,
Consumer6<T,U,V,W,X,Y> func,
T t,
U u,
V v,
W w,
X x,
Y y) |
static <T,U,V,W,X,Y,Z> |
onEDTv(java.lang.Object qid,
Consumer7<T,U,V,W,X,Y,Z> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z) |
static <T,U,V,W,X,Y,Z,A> |
onEDTv(java.lang.Object qid,
Consumer8<T,U,V,W,X,Y,Z,A> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z,
A a) |
static <T,U,V,W> java.util.concurrent.CompletableFuture<java.lang.Void> |
onEDTv(java.lang.Object qid,
QuadConsumer<T,U,V,W> func,
T t,
U u,
V v,
W w) |
static java.util.concurrent.CompletableFuture<java.lang.Void> |
onEDTv(java.lang.Object qid,
java.lang.Runnable func)
Asynchronously executes a Runnable on the EDT.
|
static <T,U,V> java.util.concurrent.CompletableFuture<java.lang.Void> |
onEDTv(java.lang.Object qid,
TriConsumer<T,U,V> func,
T t,
U u,
V v) |
static java.lang.String |
qidToString(java.lang.Object qid) |
static java.util.concurrent.ScheduledFuture<?> |
schedule(java.lang.Runnable func,
long millis) |
static int |
scheduledForEDT() |
static <T,U> void |
spawnBlocking(java.lang.Object qid,
java.util.function.BiConsumer<T,U> func,
T t,
U u) |
static <T,U,R> java.util.concurrent.CompletableFuture<R> |
spawnBlocking(java.lang.Object qid,
java.util.function.BiFunction<T,U,R> func,
T t,
U u) |
static <R> java.util.concurrent.CompletableFuture<R> |
spawnBlocking(java.lang.Object qid,
java.util.concurrent.Callable<R> func) |
static <T> void |
spawnBlocking(java.lang.Object qid,
java.util.function.Consumer<T> func,
T t) |
static <T,U,V,W,X> |
spawnBlocking(java.lang.Object qid,
Consumer5<T,U,V,W,X> func,
T t,
U u,
V v,
W w,
X x) |
static <T,U,V,W,X,Y> |
spawnBlocking(java.lang.Object qid,
Consumer6<T,U,V,W,X,Y> func,
T t,
U u,
V v,
W w,
X x,
Y y) |
static <T,U,V,W,X,Y,Z> |
spawnBlocking(java.lang.Object qid,
Consumer7<T,U,V,W,X,Y,Z> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z) |
static <T,R> java.util.concurrent.CompletableFuture<R> |
spawnBlocking(java.lang.Object qid,
java.util.function.Function<T,R> func,
T t) |
static <T,U,V,W,X,R> |
spawnBlocking(java.lang.Object qid,
Function5<T,U,V,W,X,R> func,
T t,
U u,
V v,
W w,
X x) |
static <T,U,V,W,X,Y,R> |
spawnBlocking(java.lang.Object qid,
Function6<T,U,V,W,X,Y,R> func,
T t,
U u,
V v,
W w,
X x,
Y y) |
static <T,U,V,W,X,Y,Z,R> |
spawnBlocking(java.lang.Object qid,
Function7<T,U,V,W,X,Y,Z,R> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z) |
static <T,U,V,W> void |
spawnBlocking(java.lang.Object qid,
QuadConsumer<T,U,V,W> func,
T t,
U u,
V v,
W w) |
static <T,U,V,W,R> |
spawnBlocking(java.lang.Object qid,
QuadFunction<T,U,V,W,R> func,
T t,
U u,
V v,
W w) |
static void |
spawnBlocking(java.lang.Object qid,
java.lang.Runnable func)
Spawns a blocking task in a way that the underlying thread pool will make sure that the pool won't starve.
|
static <T,U,V> void |
spawnBlocking(java.lang.Object qid,
TriConsumer<T,U,V> func,
T t,
U u,
V v) |
static <T,U,V,R> java.util.concurrent.CompletableFuture<R> |
spawnBlocking(java.lang.Object qid,
TriFunction<T,U,V,R> func,
T t,
U u,
V v) |
static java.util.concurrent.Future<?> |
submitSpareTimeJob(java.lang.Runnable func) |
static void |
syncEDT()
Blocks the calling thread until all currently pending independent Swing events
on the EDT have been processed.
|
static void |
syncEDT(java.lang.Object qid)
Blocks the calling thread until all currently pending Swing events (and SPU tasks)
associated with the given
qid have been fully processed on the EDT. |
java.lang.String |
toString() |
static <T,U,R> R |
willBlock(java.util.function.BiFunction<T,U,R> func,
T t,
U u) |
static <R> R |
willBlock(java.util.concurrent.Callable<R> func) |
static <T,R> R |
willBlock(java.util.function.Function<T,R> func,
T t) |
static <T,U,V,W,X,R> |
willBlock(Function5<T,U,V,W,X,R> func,
T t,
U u,
V v,
W w,
X x) |
static <T,U,V,W,X,Y,R> |
willBlock(Function6<T,U,V,W,X,Y,R> func,
T t,
U u,
V v,
W w,
X x,
Y y) |
static <T,U,V,W,X,Y,Z,R> |
willBlock(Function7<T,U,V,W,X,Y,Z,R> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z) |
static <T,U,V,W,R> |
willBlock(QuadFunction<T,U,V,W,R> func,
T t,
U u,
V v,
W w) |
static <T,U,V,R> R |
willBlock(TriFunction<T,U,V,R> func,
T t,
U u,
V v) |
static <T,U> void |
willBlockv(java.util.function.BiConsumer<T,U> func,
T t,
U u) |
static <T> void |
willBlockv(java.util.function.Consumer<T> func,
T t) |
static <T,U,V,W,X> |
willBlockv(Consumer5<T,U,V,W,X> func,
T t,
U u,
V v,
W w,
X x) |
static <T,U,V,W,X,Y> |
willBlockv(Consumer6<T,U,V,W,X,Y> func,
T t,
U u,
V v,
W w,
X x,
Y y) |
static <T,U,V,W,X,Y,Z> |
willBlockv(Consumer7<T,U,V,W,X,Y,Z> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z) |
static <T,U,V,W> void |
willBlockv(QuadConsumer<T,U,V,W> func,
T t,
U u,
V v,
W w) |
static void |
willBlockv(java.lang.Runnable func)
Informs the underlying ForkJoinPool (in case we use FJP) that the current task is about to block.
|
static <T,U,V> void |
willBlockv(TriConsumer<T,U,V> func,
T t,
U u,
V v) |
public static final int MAX_SCHEDULE_PER_QID
Integer.MAX_VALUE, implying that off-EDT tasks for the same component
might run in parallel if the pool allows it, rather than strictly sequentially.public static java.util.concurrent.CompletableFuture<java.lang.Void> offEDTv(java.lang.Object qid,
java.lang.Runnable func)
qid - The serialization key (e.g., the Component). Pass null for independent execution.func - The void-returning logic to run.public static java.util.concurrent.CompletableFuture<java.lang.Void> onEDTv(java.lang.Object qid,
java.lang.Runnable func)
qid - The serialization key.func - The logic to run on the UI thread.public static <T> java.util.concurrent.CompletableFuture<java.lang.Void> offEDTv(java.lang.Object qid,
java.util.function.Consumer<T> func,
T t)
These methods are overloads of offEDTv(Object, Runnable) that accept arguments directly,
creating a curried Runnable to avoid manual lambda capturing.
qid - The serialization key.func - The consumer to execute.t - The argument to pass to the consumer.public static <T> java.util.concurrent.CompletableFuture<java.lang.Void> onEDTv(java.lang.Object qid,
java.util.function.Consumer<T> func,
T t)
offEDTv(Object, Consumer, Object)public static <T,U> java.util.concurrent.CompletableFuture<java.lang.Void> offEDTv(java.lang.Object qid,
java.util.function.BiConsumer<T,U> func,
T t,
U u)
offEDTv(Object, Consumer, Object)public static <T,U> java.util.concurrent.CompletableFuture<java.lang.Void> onEDTv(java.lang.Object qid,
java.util.function.BiConsumer<T,U> func,
T t,
U u)
offEDTv(Object, Consumer, Object)public static <T,U,V> java.util.concurrent.CompletableFuture<java.lang.Void> offEDTv(java.lang.Object qid,
TriConsumer<T,U,V> func,
T t,
U u,
V v)
public static <T,U,V> java.util.concurrent.CompletableFuture<java.lang.Void> onEDTv(java.lang.Object qid,
TriConsumer<T,U,V> func,
T t,
U u,
V v)
public static <T,U,V,W> java.util.concurrent.CompletableFuture<java.lang.Void> offEDTv(java.lang.Object qid,
QuadConsumer<T,U,V,W> func,
T t,
U u,
V v,
W w)
public static <T,U,V,W> java.util.concurrent.CompletableFuture<java.lang.Void> onEDTv(java.lang.Object qid,
QuadConsumer<T,U,V,W> func,
T t,
U u,
V v,
W w)
public static <T,U,V,W,X> java.util.concurrent.CompletableFuture<java.lang.Void> offEDTv(java.lang.Object qid,
Consumer5<T,U,V,W,X> func,
T t,
U u,
V v,
W w,
X x)
public static <T,U,V,W,X> java.util.concurrent.CompletableFuture<java.lang.Void> onEDTv(java.lang.Object qid,
Consumer5<T,U,V,W,X> func,
T t,
U u,
V v,
W w,
X x)
public static <T,U,V,W,X,Y> java.util.concurrent.CompletableFuture<java.lang.Void> offEDTv(java.lang.Object qid,
Consumer6<T,U,V,W,X,Y> func,
T t,
U u,
V v,
W w,
X x,
Y y)
public static <T,U,V,W,X,Y> java.util.concurrent.CompletableFuture<java.lang.Void> onEDTv(java.lang.Object qid,
Consumer6<T,U,V,W,X,Y> func,
T t,
U u,
V v,
W w,
X x,
Y y)
public static <T,U,V,W,X,Y,Z> java.util.concurrent.CompletableFuture<java.lang.Void> offEDTv(java.lang.Object qid,
Consumer7<T,U,V,W,X,Y,Z> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z)
public static <T,U,V,W,X,Y,Z> java.util.concurrent.CompletableFuture<java.lang.Void> onEDTv(java.lang.Object qid,
Consumer7<T,U,V,W,X,Y,Z> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z)
public static <T,U,V,W,X,Y,Z,A> java.util.concurrent.CompletableFuture<java.lang.Void> offEDTv(java.lang.Object qid,
Consumer8<T,U,V,W,X,Y,Z,A> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z,
A a)
public static <T,U,V,W,X,Y,Z,A> java.util.concurrent.CompletableFuture<java.lang.Void> onEDTv(java.lang.Object qid,
Consumer8<T,U,V,W,X,Y,Z,A> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z,
A a)
public static <R> java.util.concurrent.CompletableFuture<R> offEDT(java.lang.Object qid,
java.util.concurrent.Callable<R> func)
qid - The serialization key.func - The logic that returns a result.public static <R> java.util.concurrent.CompletableFuture<R> onEDT(java.lang.Object qid,
java.util.concurrent.Callable<R> func)
qid - The serialization key.func - The logic that returns a result.public static <T,R> java.util.concurrent.CompletableFuture<R> offEDT(java.lang.Object qid,
java.util.function.Function<T,R> func,
T t)
These methods are overloads of offEDT(Object, Callable) that accept arguments directly,
creating a curried Callable to avoid manual lambda capturing.
qid - The serialization key.func - The function to execute.t - The argument to pass to the function.public static <T,R> java.util.concurrent.CompletableFuture<R> onEDT(java.lang.Object qid,
java.util.function.Function<T,R> func,
T t)
offEDT(Object, Function, Object)public static <T,U,R> java.util.concurrent.CompletableFuture<R> offEDT(java.lang.Object qid,
java.util.function.BiFunction<T,U,R> func,
T t,
U u)
offEDT(Object, Function, Object)public static <T,U,R> java.util.concurrent.CompletableFuture<R> onEDT(java.lang.Object qid,
java.util.function.BiFunction<T,U,R> func,
T t,
U u)
offEDT(Object, Function, Object)public static <T,U,V,R> java.util.concurrent.CompletableFuture<R> offEDT(java.lang.Object qid,
TriFunction<T,U,V,R> func,
T t,
U u,
V v)
public static <T,U,V,R> java.util.concurrent.CompletableFuture<R> onEDT(java.lang.Object qid,
TriFunction<T,U,V,R> func,
T t,
U u,
V v)
public static <T,U,V,W,R> java.util.concurrent.CompletableFuture<R> offEDT(java.lang.Object qid,
QuadFunction<T,U,V,W,R> func,
T t,
U u,
V v,
W w)
public static <T,U,V,W,R> java.util.concurrent.CompletableFuture<R> onEDT(java.lang.Object qid,
QuadFunction<T,U,V,W,R> func,
T t,
U u,
V v,
W w)
public static <T,U,V,W,X,R> java.util.concurrent.CompletableFuture<R> offEDT(java.lang.Object qid,
Function5<T,U,V,W,X,R> func,
T t,
U u,
V v,
W w,
X x)
public static <T,U,V,W,X,R> java.util.concurrent.CompletableFuture<R> onEDT(java.lang.Object qid,
Function5<T,U,V,W,X,R> func,
T t,
U u,
V v,
W w,
X x)
public static <T,U,V,W,X,Y,R> java.util.concurrent.CompletableFuture<R> offEDT(java.lang.Object qid,
Function6<T,U,V,W,X,Y,R> func,
T t,
U u,
V v,
W w,
X x,
Y y)
public static <T,U,V,W,X,Y,R> java.util.concurrent.CompletableFuture<R> onEDT(java.lang.Object qid,
Function6<T,U,V,W,X,Y,R> func,
T t,
U u,
V v,
W w,
X x,
Y y)
public static <T,U,V,W,X,Y,Z,R> java.util.concurrent.CompletableFuture<R> offEDT(java.lang.Object qid,
Function7<T,U,V,W,X,Y,Z,R> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z)
public static <T,U,V,W,X,Y,Z,R> java.util.concurrent.CompletableFuture<R> onEDT(java.lang.Object qid,
Function7<T,U,V,W,X,Y,Z,R> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z)
public static <T,U,V,W,X,Y,Z,A,R> java.util.concurrent.CompletableFuture<R> offEDT(java.lang.Object qid,
Function8<T,U,V,W,X,Y,Z,A,R> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z,
A a)
public static <T,U,V,W,X,Y,Z,A,R> java.util.concurrent.CompletableFuture<R> onEDT(java.lang.Object qid,
Function8<T,U,V,W,X,Y,Z,A,R> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z,
A a)
public static <T,U,V,W,X,Y,Z,A,B,R> java.util.concurrent.CompletableFuture<R> offEDT(java.lang.Object qid,
Function9<T,U,V,W,X,Y,Z,A,B,R> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z,
A a,
B b)
public static <T,U,V,W,X,Y,Z,A,B,R> java.util.concurrent.CompletableFuture<R> onEDT(java.lang.Object qid,
Function9<T,U,V,W,X,Y,Z,A,B,R> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z,
A a,
B b)
public static <T,U,V,W,X,Y,Z,A,B,C,R> java.util.concurrent.CompletableFuture<R> offEDT(java.lang.Object qid,
Function10<T,U,V,W,X,Y,Z,A,B,C,R> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z,
A a,
B b,
C c)
public static <T,U,V,W,X,Y,Z,A,B,C,R> java.util.concurrent.CompletableFuture<R> onEDT(java.lang.Object qid,
Function10<T,U,V,W,X,Y,Z,A,B,C,R> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z,
A a,
B b,
C c)
public static java.util.concurrent.CompletableFuture<?> offEDT(java.lang.Object qid,
java.lang.Class<?> cl,
java.lang.String mname,
java.lang.Object[] args,
java.lang.Class<?>[] argtypes)
public static java.util.concurrent.CompletableFuture<?> onEDT(java.lang.Object qid,
java.lang.Class<?> cl,
java.lang.String mname,
java.lang.Object[] args,
java.lang.Class<?>[] argtypes)
public static java.util.concurrent.CompletableFuture<?> offEDT(java.lang.Object qid,
java.lang.Object o,
java.lang.String mname,
java.lang.Object[] args,
java.lang.Class<?>[] argtypes)
public static java.util.concurrent.CompletableFuture<?> onEDT(java.lang.Object qid,
java.lang.Object o,
java.lang.String mname,
java.lang.Object[] args,
java.lang.Class<?>[] argtypes)
public static final <T> java.util.concurrent.Future<T> fork(java.util.concurrent.Callable<T> c)
Note:
This provides NO guarantees about sequence of submission and execution regarding a qid.
It essentially acts as a wrapper around the internal ForkJoinPool (in case we use FJP).
public static final java.util.concurrent.Future<java.lang.Void> forkv(java.lang.Runnable r)
Note:
This provides NO guarantees about sequence of submission and execution regarding a qid.
public static <T> java.util.concurrent.CompletableFuture<java.lang.Void> delayOnEDT(int delay,
java.util.concurrent.TimeUnit unit,
java.lang.Object qid,
java.util.function.Consumer<T> func,
T t)
delay - Time to wait.unit - Time unit.qid - The queue ID.func - The logic to execute.public static java.util.concurrent.CompletableFuture<java.lang.Void> delayOnEDT(int delay,
java.util.concurrent.TimeUnit unit,
java.lang.Object qid,
java.lang.Runnable func)
public static boolean invokeAndWaitIfNotOnEDT(java.lang.Object qid,
java.lang.Runnable func)
Usage pattern:
void updateUI() {
if (SPU.invokeAndWaitIfNotOnEDT(this, this::updateUI)) {
return;
}
// ... actual UI logic here ...
}
true if the current thread was NOT the EDT and the task was dispatched/waited for.
false if already on EDT, meaning execution should proceed immediately in caller.public static <T,R> boolean invokeAndWaitIfNotOnEDT(java.lang.Object qid,
java.util.function.Function<T,R> func,
T t)
public static void offEDTAndWaitv(java.lang.Object qid,
java.lang.Runnable func)
Safe to call from EDT; uses SecondaryLoop to keep UI responsive while waiting.
public static void onEDTAndWaitv(java.lang.Object qid,
java.lang.Runnable func)
Safe to call from EDT (uses SecondaryLoop) or background threads.
public static <T> void offEDTAndWaitv(java.lang.Object qid,
java.util.function.Consumer<T> func,
T t)
offEDTAndWaitv(Object, Runnable)public static <T> void onEDTAndWaitv(java.lang.Object qid,
java.util.function.Consumer<T> func,
T t)
onEDTAndWaitv(Object, Runnable)public static <T,U> void offEDTAndWaitv(java.lang.Object qid,
java.util.function.BiConsumer<T,U> func,
T t,
U u)
offEDTAndWaitv(Object, Runnable)public static <T,U> void onEDTAndWaitv(java.lang.Object qid,
java.util.function.BiConsumer<T,U> func,
T t,
U u)
onEDTAndWaitv(Object, Runnable)public static <T,U,V> void offEDTAndWaitv(java.lang.Object qid,
TriConsumer<T,U,V> func,
T t,
U u,
V v)
public static <T,U,V> void onEDTAndWaitv(java.lang.Object qid,
TriConsumer<T,U,V> func,
T t,
U u,
V v)
public static <T,U,V,W> void offEDTAndWaitv(java.lang.Object qid,
QuadConsumer<T,U,V,W> func,
T t,
U u,
V v,
W w)
public static <T,U,V,W> void onEDTAndWaitv(java.lang.Object qid,
QuadConsumer<T,U,V,W> func,
T t,
U u,
V v,
W w)
public static <T,U,V,W,X> void offEDTAndWaitv(java.lang.Object qid,
Consumer5<T,U,V,W,X> func,
T t,
U u,
V v,
W w,
X x)
public static <T,U,V,W,X> void onEDTAndWaitv(java.lang.Object qid,
Consumer5<T,U,V,W,X> func,
T t,
U u,
V v,
W w,
X x)
public static <T,U,V,W,X,Y> void offEDTAndWaitv(java.lang.Object qid,
Consumer6<T,U,V,W,X,Y> func,
T t,
U u,
V v,
W w,
X x,
Y y)
public static <T,U,V,W,X,Y> void onEDTAndWaitv(java.lang.Object qid,
Consumer6<T,U,V,W,X,Y> func,
T t,
U u,
V v,
W w,
X x,
Y y)
public static <T,U,V,W,X,Y,Z> void offEDTAndWaitv(java.lang.Object qid,
Consumer7<T,U,V,W,X,Y,Z> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z)
public static <T,U,V,W,X,Y,Z> void onEDTAndWaitv(java.lang.Object qid,
Consumer7<T,U,V,W,X,Y,Z> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z)
public static <T,U,V,W,X,Y,Z,A> void offEDTAndWaitv(java.lang.Object qid,
Consumer8<T,U,V,W,X,Y,Z,A> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z,
A a)
public static <T,U,V,W,X,Y,Z,A> void onEDTAndWaitv(java.lang.Object qid,
Consumer8<T,U,V,W,X,Y,Z,A> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z,
A a)
public static <T,U,V,W,X,Y,Z,A,B,R> void offEDTAndWaitv(java.lang.Object qid,
Consumer9<T,U,V,W,X,Y,Z,A,B> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z,
A a,
B b)
public static <T,U,V,W,X,Y,Z,A,B,R> void onEDTAndWaitv(java.lang.Object qid,
Consumer9<T,U,V,W,X,Y,Z,A,B> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z,
A a,
B b)
public static <T,U,V,W,X,Y,Z,A,B,C,R> void offEDTAndWaitv(java.lang.Object qid,
Consumer10<T,U,V,W,X,Y,Z,A,B,C> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z,
A a,
B b,
C c)
public static <T,U,V,W,X,Y,Z,A,B,C,R> void onEDTAndWaitv(java.lang.Object qid,
Consumer10<T,U,V,W,X,Y,Z,A,B,C> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z,
A a,
B b,
C c)
public static <R> R offEDTAndWait(java.lang.Object qid,
java.util.concurrent.Callable<R> func)
offEDTAndWaitv(Object, Runnable)public static <R> R onEDTAndWait(java.lang.Object qid,
java.util.concurrent.Callable<R> func)
onEDTAndWaitv(Object, Runnable)public static <T,R> R offEDTAndWait(java.lang.Object qid,
java.util.function.Function<T,R> func,
T t)
offEDTAndWait(Object, Callable)public static <T,R> R onEDTAndWait(java.lang.Object qid,
java.util.function.Function<T,R> func,
T t)
onEDTAndWait(Object, Callable)public static <T,U,R> R offEDTAndWait(java.lang.Object qid,
java.util.function.BiFunction<T,U,R> func,
T t,
U u)
public static <T,U,R> R onEDTAndWait(java.lang.Object qid,
java.util.function.BiFunction<T,U,R> func,
T t,
U u)
public static <T,U,V,R> R offEDTAndWait(java.lang.Object qid,
TriFunction<T,U,V,R> func,
T t,
U u,
V v)
public static <T,U,V,R> R onEDTAndWait(java.lang.Object qid,
TriFunction<T,U,V,R> func,
T t,
U u,
V v)
public static <T,U,V,W,R> R offEDTAndWait(java.lang.Object qid,
QuadFunction<T,U,V,W,R> func,
T t,
U u,
V v,
W w)
public static <T,U,V,W,R> R onEDTAndWait(java.lang.Object qid,
QuadFunction<T,U,V,W,R> func,
T t,
U u,
V v,
W w)
public static <T,U,V,W,X,R> R offEDTAndWait(java.lang.Object qid,
Function5<T,U,V,W,X,R> func,
T t,
U u,
V v,
W w,
X x)
public static <T,U,V,W,X,R> R onEDTAndWait(java.lang.Object qid,
Function5<T,U,V,W,X,R> func,
T t,
U u,
V v,
W w,
X x)
public static <T,U,V,W,X,Y,R> R offEDTAndWait(java.lang.Object qid,
Function6<T,U,V,W,X,Y,R> func,
T t,
U u,
V v,
W w,
X x,
Y y)
public static <T,U,V,W,X,Y,R> R onEDTAndWait(java.lang.Object qid,
Function6<T,U,V,W,X,Y,R> func,
T t,
U u,
V v,
W w,
X x,
Y y)
public static <T,U,V,W,X,Y,Z,R> R offEDTAndWait(java.lang.Object qid,
Function7<T,U,V,W,X,Y,Z,R> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z)
public static <T,U,V,W,X,Y,Z,R> R onEDTAndWait(java.lang.Object qid,
Function7<T,U,V,W,X,Y,Z,R> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z)
public static <T,U,V,W,X,Y,Z,A,R> R offEDTAndWait(java.lang.Object qid,
Function8<T,U,V,W,X,Y,Z,A,R> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z,
A a)
public static <T,U,V,W,X,Y,Z,A,R> R onEDTAndWait(java.lang.Object qid,
Function8<T,U,V,W,X,Y,Z,A,R> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z,
A a)
public static <T,U,V,W,X,Y,Z,A,B,R> R offEDTAndWait(java.lang.Object qid,
Function9<T,U,V,W,X,Y,Z,A,B,R> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z,
A a,
B b)
public static <T,U,V,W,X,Y,Z,A,B,R> R onEDTAndWait(java.lang.Object qid,
Function9<T,U,V,W,X,Y,Z,A,B,R> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z,
A a,
B b)
public static <T,U,V,W,X,Y,Z,A,B,C,R> R offEDTAndWait(java.lang.Object qid,
Function10<T,U,V,W,X,Y,Z,A,B,C,R> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z,
A a,
B b,
C c)
public static <T,U,V,W,X,Y,Z,A,B,C,R> R onEDTAndWait(java.lang.Object qid,
Function10<T,U,V,W,X,Y,Z,A,B,C,R> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z,
A a,
B b,
C c)
public static java.lang.Object offEDTAndWait(java.lang.Object qid,
java.lang.Class<?> cl,
java.lang.String m,
java.lang.Object[] args,
java.lang.Class<?>[] argtypes)
public static java.lang.Object onEDTAndWait(java.lang.Object qid,
java.lang.Class<?> cl,
java.lang.String m,
java.lang.Object[] args,
java.lang.Class<?>[] argtypes)
public static java.lang.Object offEDTAndWait(java.lang.Object qid,
java.lang.Object o,
java.lang.String m,
java.lang.Object[] args,
java.lang.Class<?>[] argtypes)
public static java.lang.Object onEDTAndWait(java.lang.Object qid,
java.lang.Object o,
java.lang.String m,
java.lang.Object[] args,
java.lang.Class<?>[] argtypes)
public static int scheduledForEDT()
public static void syncEDT(java.lang.Object qid)
qid have been fully processed on the EDT.
This acts as a synchronization barrier. It submits an empty no-op task to the
SPU queue for the specified qid and waits for its execution. Because SPU
serializes tasks per qid, this ensures that any previously scheduled UI updates
for this component have completed before this method returns.
Safe from EDT: Like other Wait operations in SPU, calling this
from the EDT is safe and will not cause a deadlock, as it utilizes a secondary event loop
to keep the UI responsive while waiting.
qid - the Queue ID (usually the target UI Component) to synchronize with;
if null, it synchronizes against the global, independent execution flow.onEDTAndWaitv(Object, Runnable)public static void syncEDT()
This is a convenience shortcut for syncEDT(null). It provides a global
synchronization barrier, ensuring that the EDT has "caught up" with all general,
unqueued UI events before execution continues.
public static boolean isEDT()
This is a lightweight wrapper around SwingUtilities.isEventDispatchThread().
It is typically used to verify thread safety contracts.
true if the current thread is the EDT; false otherwise.SwingUtilities.isEventDispatchThread()public static boolean isNestedEDT()
Within our SPU utility, nested loops are primarily spun when blocking operations are triggered
from within the EDT (e.g. via offEDTAndWait using a SecondaryLoop). This
allows the UI to remain responsive and process repaints while waiting for the background task to complete.
This method tracks the nesting depth of these active loops. It can be used for preventing reentrancy issues, managing task serialization, or detecting if the framework is currently pumping events in a secondary event loop.
true if the current thread is running within an active SPU-managed secondary/nested
event loop; false otherwise.offEDTAndWait(Object, Callable)public static void needsEDT()
ensureEDT().
Note: ensureEDT() is preferred because "ensure" clearly describes
the active assertion of a condition (throwing an exception on failure), whereas
"needs" in Java typically prefixes query methods returning a boolean.
public static void ensureEDT()
This assertion is bypassed if the application is running in a headless environment (e.g. during headless unit tests where no EDT exists).
java.lang.IllegalStateException - if called from outside the EDT in a non-headless environmentpublic static void ensureOutsideEDT()
This is typically used to ensure that blocking, long-running or I/O operations do not freeze the user interface, or that the save operation is not called inside the EDT, increasing deadlock risks.
java.lang.IllegalStateException - if called from within the Event Dispatch Thread (EDT)public static <T,R> R compute(java.util.function.Function<T,R> func,
T t)
public static <T,U,R> R compute(java.util.function.BiFunction<T,U,R> func,
T t,
U u)
public static <T,U,V,R> R compute(TriFunction<T,U,V,R> func, T t, U u, V v)
public static <T,U,V,W,R> R compute(QuadFunction<T,U,V,W,R> func, T t, U u, V v, W w)
public static <T> T compute(java.util.concurrent.Callable<T> c)
public static java.util.concurrent.ScheduledFuture<?> schedule(java.lang.Runnable func,
long millis)
public static java.util.concurrent.Future<?> submitSpareTimeJob(java.lang.Runnable func)
public java.lang.String toString()
toString in class java.lang.Objectpublic static java.lang.String qidToString(java.lang.Object qid)
public static void spawnBlocking(java.lang.Object qid,
java.lang.Runnable func)
public static <T> void spawnBlocking(java.lang.Object qid,
java.util.function.Consumer<T> func,
T t)
public static <T,U> void spawnBlocking(java.lang.Object qid,
java.util.function.BiConsumer<T,U> func,
T t,
U u)
public static <T,U,V> void spawnBlocking(java.lang.Object qid,
TriConsumer<T,U,V> func,
T t,
U u,
V v)
public static <T,U,V,W> void spawnBlocking(java.lang.Object qid,
QuadConsumer<T,U,V,W> func,
T t,
U u,
V v,
W w)
public static <T,U,V,W,X> void spawnBlocking(java.lang.Object qid,
Consumer5<T,U,V,W,X> func,
T t,
U u,
V v,
W w,
X x)
public static <T,U,V,W,X,Y> void spawnBlocking(java.lang.Object qid,
Consumer6<T,U,V,W,X,Y> func,
T t,
U u,
V v,
W w,
X x,
Y y)
public static <T,U,V,W,X,Y,Z> void spawnBlocking(java.lang.Object qid,
Consumer7<T,U,V,W,X,Y,Z> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z)
public static <R> java.util.concurrent.CompletableFuture<R> spawnBlocking(java.lang.Object qid,
java.util.concurrent.Callable<R> func)
public static <T,R> java.util.concurrent.CompletableFuture<R> spawnBlocking(java.lang.Object qid,
java.util.function.Function<T,R> func,
T t)
public static <T,U,R> java.util.concurrent.CompletableFuture<R> spawnBlocking(java.lang.Object qid,
java.util.function.BiFunction<T,U,R> func,
T t,
U u)
public static <T,U,V,R> java.util.concurrent.CompletableFuture<R> spawnBlocking(java.lang.Object qid,
TriFunction<T,U,V,R> func,
T t,
U u,
V v)
public static <T,U,V,W,R> java.util.concurrent.CompletableFuture<R> spawnBlocking(java.lang.Object qid,
QuadFunction<T,U,V,W,R> func,
T t,
U u,
V v,
W w)
public static <T,U,V,W,X,R> java.util.concurrent.CompletableFuture<R> spawnBlocking(java.lang.Object qid,
Function5<T,U,V,W,X,R> func,
T t,
U u,
V v,
W w,
X x)
public static <T,U,V,W,X,Y,R> java.util.concurrent.CompletableFuture<R> spawnBlocking(java.lang.Object qid,
Function6<T,U,V,W,X,Y,R> func,
T t,
U u,
V v,
W w,
X x,
Y y)
public static <T,U,V,W,X,Y,Z,R> java.util.concurrent.CompletableFuture<R> spawnBlocking(java.lang.Object qid,
Function7<T,U,V,W,X,Y,Z,R> func,
T t,
U u,
V v,
W w,
X x,
Y y,
Z z)
public static void willBlockv(java.lang.Runnable func)
Use Case:
When performing IO or waiting on a lock inside an offEDT task.
public static <T> void willBlockv(java.util.function.Consumer<T> func,
T t)
public static <T,U> void willBlockv(java.util.function.BiConsumer<T,U> func,
T t,
U u)
public static <T,U,V> void willBlockv(TriConsumer<T,U,V> func, T t, U u, V v)
public static <T,U,V,W> void willBlockv(QuadConsumer<T,U,V,W> func, T t, U u, V v, W w)
public static <T,U,V,W,X> void willBlockv(Consumer5<T,U,V,W,X> func, T t, U u, V v, W w, X x)
public static <T,U,V,W,X,Y> void willBlockv(Consumer6<T,U,V,W,X,Y> func, T t, U u, V v, W w, X x, Y y)
public static <T,U,V,W,X,Y,Z> void willBlockv(Consumer7<T,U,V,W,X,Y,Z> func, T t, U u, V v, W w, X x, Y y, Z z)
public static <R> R willBlock(java.util.concurrent.Callable<R> func)
public static <T,R> R willBlock(java.util.function.Function<T,R> func,
T t)
public static <T,U,R> R willBlock(java.util.function.BiFunction<T,U,R> func,
T t,
U u)
public static <T,U,V,R> R willBlock(TriFunction<T,U,V,R> func, T t, U u, V v)
public static <T,U,V,W,R> R willBlock(QuadFunction<T,U,V,W,R> func, T t, U u, V v, W w)
public static <T,U,V,W,X,R> R willBlock(Function5<T,U,V,W,X,R> func, T t, U u, V v, W w, X x)
public static <T,U,V,W,X,Y,R> R willBlock(Function6<T,U,V,W,X,Y,R> func, T t, U u, V v, W w, X x, Y y)
public static <T,U,V,W,X,Y,Z,R> R willBlock(Function7<T,U,V,W,X,Y,Z,R> func, T t, U u, V v, W w, X x, Y y, Z z)
Copyright © 2000-2026 OAshi S.à r.l. All Rights Reserved.