public class AsyncSupport
extends Object
Internal runtime support for the async/await/defer language features.
This class contains the actual implementation invoked by compiler-generated code. User code should prefer the static methods on Awaitable for combinators and configuration.
Thread pool configuration:
await() essentially free.groovy.async.parallelism (default: 256).Exception handling follows a transparency principle: the original exception is rethrown without being wrapped.
| Type Params | Return Type | Name and description |
|---|---|---|
<T> |
public static List<T> |
all(Object sources)Waits for all given sources to complete, returning their results in order. |
|
public static Awaitable<List<Object>> |
allAsync(Object sources)Non-blocking variant of all — returns an Awaitable. |
|
public static List<AwaitResult<Object>> |
allSettled(Object sources)Waits for all sources to settle (succeed or fail), returning a list of AwaitResult without throwing. |
|
public static Awaitable<List<AwaitResult<Object>>> |
allSettledAsync(Object sources)Non-blocking variant of allSettled — returns an Awaitable. |
<T> |
public static T |
any(Object sources)Returns the result of the first source to complete (success or failure). |
<T> |
public static Awaitable<T> |
anyAsync(Object sources)Non-blocking variant of any — returns an Awaitable. |
<T> |
public static Awaitable<T> |
async(Closure<T> closure)Executes the given closure asynchronously using the default executor. |
<T> |
public static Iterable<T> |
asyncGenerator(Closure<?> closure)Starts a generator immediately, returning an Iterable backed by a GeneratorBridge. |
<T> |
public static T |
await(Awaitable<T> awaitable)Awaits the result of an Awaitable. |
<T> |
public static T |
await(CompletableFuture<T> future)Awaits a CompletableFuture using non-interruptible join(). |
<T> |
public static T |
await(CompletionStage<T> stage)Awaits a CompletionStage by converting to CompletableFuture. |
<T> |
public static T |
await(Future<T> future)Awaits a Future. |
<T> |
public static T |
await(Object source)Awaits an arbitrary object by adapting it via Awaitable.from. |
|
public static void |
closeIterable(Object source)Closes a source if it implements Closeable or AutoCloseable. |
<T> |
public static Awaitable<T> |
completeOnTimeout(Object source, T fallback, long timeout, TimeUnit unit)Wraps a source with a timeout that uses a fallback value instead of throwing. |
<T> |
public static Awaitable<T> |
completeOnTimeoutMillis(Object source, T fallback, long millis)Convenience: timeout in milliseconds. |
|
public static Deque<Closure<?>> |
createDeferScope()Creates a new defer scope (LIFO stack of cleanup actions). |
|
public static void |
defer(Deque<Closure<?>> scope, Closure<?> action)Registers a deferred action in the given scope. |
|
public static Awaitable<Void> |
delay(long millis)Returns an Awaitable that completes after the specified delay. |
|
public static Awaitable<Void> |
delay(long duration, TimeUnit unit)Delay with explicit time unit. |
|
public Awaitable<T> |
doCall(Object args) |
|
public Iterable<T> |
doCall(Object args) |
<T> |
public static Awaitable<T> |
executeAsync(Closure<T> closure, Executor executor)Executes the given closure asynchronously on the specified executor, returning an Awaitable. |
|
public static void |
executeDeferScope(Deque<Closure<?>> scope)Executes all deferred actions in LIFO order. |
<T> |
public static T |
first(Object sources)Returns the result of the first source to complete successfully. |
<T> |
public static Awaitable<T> |
firstAsync(Object sources)Non-blocking variant of first — returns an Awaitable. |
|
public static Executor |
getExecutor()Returns the current executor used for async tasks. |
<T> |
public static Awaitable<T> |
go(Closure<T> closure)Lightweight task spawn. |
|
public static boolean |
isVirtualThreadsAvailable()Returns true if running on JDK 21+ with virtual thread support. |
<T> |
public static Awaitable<T> |
orTimeout(Object source, long timeout, TimeUnit unit)Wraps a source with a timeout. |
<T> |
public static Awaitable<T> |
orTimeoutMillis(Object source, long millis)Convenience: timeout in milliseconds. |
|
public static void |
resetExecutor()Resets the executor to the default (virtual threads on JDK 21+, cached pool otherwise). |
|
public static void |
setExecutor(Executor executor)Sets the executor used for async tasks. |
<T> |
public static Iterable<T> |
toIterable(Object source)Converts an arbitrary source to an Iterable for use in for await loops. |
|
public static Throwable |
unwrap(Throwable t) |
<T> |
public static Closure<Awaitable<T>> |
wrapAsync(Closure<T> closure)Wraps a closure so that each invocation executes the body asynchronously and returns an Awaitable. |
<T> |
public static Closure<Iterable<T>> |
wrapAsyncGenerator(Closure<?> closure)Wraps a generator closure so that each invocation returns an Iterable backed by a GeneratorBridge. |
|
public static void |
yieldReturn(Object bridge, Object value)Called by compiler-generated code for yield return expr inside
an async generator closure. |
Waits for all given sources to complete, returning their results in order.
Multi-arg await(a, b, c) desugars to this.
Non-blocking variant of all — returns an Awaitable.
Waits for all sources to settle (succeed or fail), returning a list of AwaitResult without throwing.
Non-blocking variant of allSettled — returns an Awaitable.
Returns the result of the first source to complete (success or failure).
Non-blocking variant of any — returns an Awaitable.
Executes the given closure asynchronously using the default executor.
Starts a generator immediately, returning an Iterable backed by a
GeneratorBridge. This is the runtime entry point for
async { ... yield return ... } expressions.
closure - the generator closure; receives a GeneratorBridge as first parameterT - the element typeAwaits the result of an Awaitable. Blocks the calling thread until the computation completes. The original exception is rethrown transparently.
Awaits a CompletableFuture using non-interruptible join().
Awaits a CompletionStage by converting to CompletableFuture.
Awaits a Future. Delegates to the CF overload if applicable.
Awaits an arbitrary object by adapting it via Awaitable.from. This is the fallback overload called by compiler-generated await expressions.
Closes a source if it implements Closeable or
AutoCloseable. Called by compiler-generated finally block
in for await loops.
Wraps a source with a timeout that uses a fallback value instead of throwing.
Convenience: timeout in milliseconds.
Creates a new defer scope (LIFO stack of cleanup actions).
Called by compiler-generated code at the start of closures
containing defer statements.
Registers a deferred action in the given scope. Actions execute in LIFO order when executeDeferScope is called (in the finally block).
Returns an Awaitable that completes after the specified delay.
Executes the given closure asynchronously on the specified executor, returning an Awaitable.
Executes all deferred actions in LIFO order. If multiple actions throw, subsequent exceptions are added as suppressed. If a deferred action returns a Future/Awaitable, the result is awaited before continuing.
Returns the result of the first source to complete successfully. Only fails when all sources fail.
Non-blocking variant of first — returns an Awaitable.
Returns the current executor used for async tasks.
Lightweight task spawn. Executes the closure asynchronously using the default executor.
Returns true if running on JDK 21+ with virtual thread support.
Wraps a source with a timeout. If the source does not complete within the specified time, the returned Awaitable fails with TimeoutException.
Convenience: timeout in milliseconds.
Resets the executor to the default (virtual threads on JDK 21+, cached pool otherwise).
Sets the executor used for async tasks.
Converts an arbitrary source to an Iterable for use in
for await loops. Handles arrays, collections, iterables,
iterators, and adapter-supported types. The returned iterable may
block on next() for async sources.
source - the source to convertT - the element type Wraps a closure so that each invocation executes the body asynchronously
and returns an Awaitable. This is the runtime entry point for
the async { ... } expression syntax.
def task = async { expensiveWork() }
def result = await task() // explicit call required
Wraps a generator closure so that each invocation returns an Iterable backed by a GeneratorBridge. The generator runs on a background thread and yields values via the bridge.
This is the runtime entry point for async { ... yield return ... }
expressions that contain yield return.
closure - the generator closure; receives a GeneratorBridge as first parameterT - the element type