рдпрджрд┐ рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдЦреБрд▓рд╛ рд╣реИ рддреЛ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХреНрдпреЛрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реИ?
рдпрджрд┐ рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП рдХрд┐ рд╣реБрдб рдХреЗ рддрд╣рдд рдПрдХ рдЙрдЪреНрдЪ рдЕрдиреБрдХреВрд▓рд┐рдд, рд╣рд╛рд░реНрдб-рдЯреВ-рд░реАрдб рдХреЛрдб рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрдзреНрдпрдпрди рдереЛрдбрд╝рд╛ рд╢реИрдХреНрд╖рдгрд┐рдХ рд░реВрдк рд╕реЗ рджреЗрддрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЙрдирдХреЗ рд╡рд┐рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд╢рдмреНрджрд╛рд░реНрдереЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдПрдВрдЧреЗ, рдФрд░ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рд╕рдордХрдХреНрд╖, рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рдФрд░ рдкрдардиреАрдп рдХреЛрдб рд▓рд┐рдЦреЗрдВрдЧреЗ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдореЗрдореЛрд░реА рдЦрдкрдд рдФрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕рдордп рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕рдмрд╕реЗ рдХрд┐рдлрд╛рдпрддреА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдЖрдЗрдП рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд░рд▓ рд╡рд┐рдзрд┐ рд╕реЗ рд╢реБрд░реБрдЖрдд рдХрд░реЗрдВ:
public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier, Executor executor) Returns a new CompletableFuture that is asynchronously completed by a task running in the given executor with the value obtained by calling the given Supplier. Type Parameters: U - the function's return type Parameters: supplier - a function returning the value to be used to complete the returned CompletableFuture executor - the executor to use for asynchronous execution Returns: the new CompletableFuture
рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдзреНрдпрд╛рди рд╕реЗ рдкрдврд╝реЗрдВ:
Returns a new CompletableFuture
рдпрд╣реА рд╣реИ, рдЯрд╛рдЗрдк CompletableFuture
рдпрд╛ рдЙрд╕рдХреЗ рдЙрдкрд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИред
that is asynchronously completed by a task running in the given executor`
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдХрд╛рд░реНрдп рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ Executor
рдХреЗ рдИ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ, Executor
рдХреЗрд╡рд▓ Runnable
рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред
рд░рдирдиреЗрдмрд▓ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ, рдФрд░ рдкрд╣рд▓реА рд╡рд╕реНрддреБ рдЗрд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреА рд╣реИ - рдЗрд╕рд▓рд┐рдП рд╣рдо рдПрдХ рд╡рд╕реНрддреБ рдореЗрдВ рджреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗред
completed ... with the value obtained by calling the given Supplier.
рдЗрд╕ Runnable
рдХреЛ рдкреНрд░рджрддреНрдд Supplier
рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдкреНрд░рд╛рдкреНрдд рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдмрдирд╛рдП рдЧрдП CompletableFuture
рдкреВрд░рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
Supplier
рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд░рд╣рд┐рдд рдлрд╝рдВрдХреНрд╢рди рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕рдм рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ:
class CompletableFutureForSupplyAsync<U> extends CompletableFuture<U> implements Runnable { Supplier<U> supplier; public CompletableFutureForSupplyAsync(Supplier<U> supplier) { this.supplier = supplier; } public void run() { try { U result = supplier.get(); super.complete(result); } catch (Throwable e) { super.completeExceptionally(e); } } } public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier, Executor executor) { CompletableFutureForSupplyAsync<U> task = new CompletableFutureForSupplyAsync<>(supplier); executor.execute(task); return task; }
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдереЛрдбрд╝рд╛ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ:
public <U> CompletableFuture<U> thenApplyAsync(Function<? super T,? extends U> fn, Executor executor) Returns a new CompletionStage that, when this stage completes normally, is executed using the supplied Executor, with this stage's result as the argument to the supplied function. See the CompletionStage documentation for rules covering exceptional completion. Specified by: thenApplyAsync in interface CompletionStage<T> Type Parameters: U - the function's return type Parameters: fn - the function to use to compute the value of the returned CompletionStage executor - the executor to use for asynchronous execution Returns: the new CompletionStage
Returns a new CompletionStage that... is executed using the supplied Executor
рдпрд╣рд╛рдВ рд╣рдореЗрдВ рд╕реАрдзреЗ Runnable
рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдИ рдЧрдИ рд╡рд╕реНрддреБ рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХрд░рдиреЗ рдХреА рдкреЗрд╢рдХрд╢ рдХреА рдЬрд╛рддреА рд╣реИред
... with this stage's result as the argument to the supplied function.
рд▓реЗрдХрд┐рди рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ, рдФрд░ рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдорд╛рди рд╡рд░реНрддрдорд╛рди CompletionStage
рдкреВрд░рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдорд╛рди рд╣реИред thenApplyAsync
рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд╕рдордп thenApplyAsync
рдпрд╣ рдорд╛рди рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рддреБрд░рдВрдд thenApplyAsync
рдкрд░ рдХрд╛рд░реНрдп рдирд╣реАрдВ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдореЗрдВ рд╡рд░реНрддрдорд╛рди CompletionStage
рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП,
рддрд╛рдХрд┐ рдЗрд╕рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рд╕рдордп, рдпрд╣ рдЕрдкрдиреЗ рдореВрд▓реНрдп рдХреЛ рдХрд╛рд░реНрдп рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджреЗред whenComplete
рдХреЗ рдХрдИ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рдЬреЛ рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рдЙрдкрдпреБрдХреНрдд рд╣реИ, рдЬрдм whenComplete
:
public CompletableFuture<T> whenComplete(BiConsumer<? super T,? super Throwable> action) Returns a new CompletionStage with the same result or exception as this stage, that executes the given action when this stage completes.
рдпрд╣реА рд╣реИ, рдирдП рдмрдирд╛рдП рдЧрдП рдХрд╛рд░реНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ, рддрд░реНрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП BiConsumer
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ:
class CompletableFutureForApplyAsync<T, U> extends CompletableFuture<U> implements Runnable, BiConsumer<T,Throwable> { Function<? super T,? extends U> fn; Executor executor; T arg; Throwable throwable; public CompletableFutureForApplyAsync(Function<? super T,? extends U> fn, Executor executor) { this.fn = fn; this.executor = executor; } @Override
рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреА рдкреНрд░рдХреГрддрд┐ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рд╣рдо рдЗрд╕рдХреЗ рдореБрдЦреНрдп рдЪрд░рдгреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рддреЗ рд╣реИрдВ:
1) рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрдирд╛рдИ рдЧрдИ рд╣реИ:
CompletableFutureForApplyAsync<T,U> task = new CompletableFutureForApplyAsync<>(fn, executor);
2) рдпрд╣ рдЕрднреА рддрдХ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рд▓рд╛рдкрддрд╛ рддрд░реНрдХ рдХреЗ рдкреНрд░рджрд╛рддрд╛ рд╕реЗ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕ рддрд░реНрдХ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВ, рд╣рдордиреЗ рдЬреЛ рд╡рд┐рдзрд┐ рдкреНрд░рд╕реНрддреБрдд рдХреА рд╣реИ, рдЙрд╕реЗ рдХреЙрд▓ рдХрд░рдХреЗ:
this.whenComplete(task);
3) рдЗрд╕ рдкрджреНрдзрддрд┐ рдореЗрдВ рд╣рдо рди рдХреЗрд╡рд▓ рдкреНрд░рд╛рдкреНрдд рддрд░реНрдХ рдХреЛ рдмрдЪрд╛рддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рднреА рдЪрд▓рд╛рддреЗ рд╣реИрдВ ( accept
() рд╡рд┐рдзрд┐ рджреЗрдЦреЗрдВ)ред
4) рдХрд╛рд░реНрдп рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╣рдореЗрдВ рджрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдХреА рдкреВрд░реНрддрд┐ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рд╣реЛ рдЧрдпрд╛ рд╣реИред
рдпрд╣ рдкрд░рд┐рдгрд╛рдо рдареАрдХ рдЙрд╕реА рддрд░рд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рд╣рдорд╛рд░реА рдирд╡-рдирд┐рд░реНрдорд┐рдд рд╡рд╕реНрддреБ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА (рдЬрдм) тАЛтАЛрд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рд╣рдо рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рд▓рдВрдмрд╛рдИ рдХреА рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдмрдирд╛ рд╕рдХреЗрдВред рд▓реЗрдХрд┐рди рдпрд╣ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╛рдирддрд╛ рдХреЗ, рд╕рдЦреНрддреА рд╕реЗ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдкреВрд░реА рд╣реЛрдЧреАред
рд▓реЗрдХрд┐рди рд╕рдорд╛рдирд╛рдВрддрд░ рд╢рд╛рдЦрд╛рдУрдВ рд╡рд╛рд▓реЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЧрдгрдирд╛ рдЖрд░реЗрдЦ рдХреЛ рдХреИрд╕реЗ рдЪрд┐рддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП?
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, thenCombineAsync
рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рдпрджрд┐ рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╣рдордиреЗ рдПрдХ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХреА, рддреЛ рдЗрд╕ рдореЗрдВ - рджреЛ рдХреЗ рд╕рд╛рдеред
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рджреЛрдиреЛрдВ рддрд░реНрдХреЛрдВ рдХреА рдЧрдгрдирд╛ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рд╣реЛ рд╕рдХрддреА рд╣реИред
ublic <U,V> CompletableFuture<V> thenCombineAsync(CompletionStage<? extends U> other, BiFunction<? super T,? super U,? extends V> fn, Executor executor) Description copied from interface: CompletionStage Returns a new CompletionStage that, when this and the other given stage complete normally, is executed using the supplied executor, with the two results as arguments to the supplied function.
рдпрд╣рд╛рдВ, рд╕рдмрдХреБрдЫ thenApplyAsync
рдЙрджрд╛рд╣рд░рдг рдореЗрдВ thenApplyAsync
рд╕рд╛рде thenApplyAsync
, рд▓реЗрдХрд┐рди рдлрд╝рдВрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рджреЛ рддрд░реНрдХ рд╣реИрдВ, рдФрд░ thenApplyAsync
CompletionStage<? extends U> other
рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ CompletionStage<? extends U> other
CompletionStage<? extends U> other
, рдЬреЛ рджреВрд╕рд░реЗ рддрд░реНрдХ рдХрд╛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░рджрд╛рддрд╛ рд╣реИред
рд╣рдо рдХреИрд╕реЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рджреВрд╕рд░рд╛ рддрд░реНрдХ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ?
рдЦреИрд░, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдЪрд░ T arg
рдмрдЬрд╛рдп T arg
рджреЛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВ: T arg1; U arg2;
T arg1; U arg2;
, рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рдмрдЬрд╛рдп рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ void accept(T argument, Throwable throwable)
рджреЛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ - accept1
рдФрд░ accept2
,
рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЕрдкрдиреЗ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдЙрд╕реА рд╕рдордп, рдирд┐рд░реНрдорд╛рдгрд╛рдзреАрди рд╣рдорд╛рд░реА рд╡рд╕реНрддреБ рдЕрдм BiConsumer<T,Throwable>
рд▓рд╛рдЧреВ рдХрд░рддреА BiConsumer<T,Throwable>
рдФрд░ рд╣рдо рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЧрдгрдирд╛ рдЧреНрд░рд╛рдл рдХреЗ рдиреЛрдбреНрд╕ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд╛рдХреНрдп рдирд╣реАрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ
this.whenComplete(task);
рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдПрдХ рдЕрд▓рдЧ рд╡рд░реНрдЧ рдореЗрдВ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓реЗ рдмрд┐рдирд╛, рд╡рд┐рдзрд┐ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
this.whenComplete(task::accept1); other.whenComplete(task::accept2);
рдпрд╣реА рд╣реИ, рд╡рд░реНрддрдорд╛рди this
рд╡рд╕реНрддреБ рдкрд╣рд▓реЗ рддрд░реНрдХ рдХреА рдЖрдкреВрд░реНрддрд┐ рдХрд░рддреА рд╣реИ, рдФрд░ other
рд╡рд╕реНрддреБ other
рд╡рд╕реНрддреБред
рдпрд╣рд╛рдВ рдХреЗрд╡рд▓ рдЙрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдХреЛрдб рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рд╡реЗ рдЕрдкрдиреЗ рддрд░реНрдХ рдХреЗ рдЖрдиреЗ рдкрд░ рддреБрд░рдВрдд рдХрд╛рд░реНрдп рд╢реБрд░реВ рди рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рджреВрд╕рд░реЗ рдХреА рдкреНрд░рд╛рдкреНрддрд┐ рдХреА рднреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ:
public synchronized void accept1(T argument, Throwable throwable) { if (throwable != null) { this.throwable = throwable; executor.execute(this); } else { this.arg1 = argument; if (arg2 != null) { executor.execute(this); } } }
рд╕реНрд╡реАрдХрд╛рд░ 2 рд╡рд┐рдзрд┐ рдЗрд╕реА рддрд░рд╣ рд╡рд░реНрдгрд┐рдд рд╣реИред
рдзреНрдпрд╛рди рджреЗрдВ:
- рддрд░реАрдХреЗ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ (рд╣рдо рд╕рд╛рдорд╛рдиреНрдп рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ)
- рддреНрд░реБрдЯрд┐ рд╕рдВрдЪрд░рдг рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рджреВрд╕рд░реЗ рддрд░реНрдХ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред
- рдпрд╣ рдЬрд╛рдБрдЪрдирд╛ рдХрд┐ рддрд░реНрдХ
null
рддреБрд▓рдирд╛ рдореЗрдВ рдЖрддрд╛ рд╣реИ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рд╢рд╛рдпрдж рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдмреВрд▓рд┐рдпрди рдЪрд░ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЗрд╕ рддрд░рд╣, рдЖрдк рджреЛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рддрд░реНрдХреЛрдВ рд╕реЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡рд┐рдЪрд╛рд░ рддреБрд░рдВрдд рд╕рд╛рдордиреЗ рдЖрддрд╛ рд╣реИ - рдХреНрдпрд╛ рдЖрдк рдЕрднреА рднреА рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд╡рд░реНрдЧ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдЦреБрдж рдХреА рд╡рд┐рдзрд┐ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдпрд╣ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдмрдирд╛ рд░рд╣рд╛ рд╣реИ?
Parameter<Integer> arg1 = new Parameter<>(); Parameter<Float> arg2 = new Parameter<>(); ... future1.whenComplete(arg1); future2.whenComplete(arg2);
рд╣рд╛рдВ, рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреА рдХрдХреНрд╖рд╛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдЧрд▓реА рдмрд╛рд░ рдЙрд╕ рдкрд░ рдЕрдзрд┐рдХред
рдкреВрд░реНрд╡рдЧрд╛рдореА рдХрд╛ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╕рд╛рд░рд╛рдВрд╢:
- рдПрдХ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЗрдВрдЯрд░рдХрдиреЗрдХреНрдЯреЗрдб рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ рд╣реИ,
рдЬреИрд╕реЗ рдПрдХ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЗрдВрдЯрд░рдХрдиреЗрдХреНрдЯреЗрдб рдереНрд░реЗрдб рдереНрд░реЗрдбреНрд╕ (рдереНрд░реЗрдбреНрд╕) рдХрд╛ рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ рд╣реИред
рд▓реЗрдХрд┐рди рд╕рдВрдЪрд╛рд░ рдкреНрд░рд╡рд╛рд╣ рдФрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд╕рд╛рдзрди рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рднрд┐рдиреНрди рд╣реИрдВред
рдзрд╛рд░рд╛рдПрдБ рд╕реЗрдорд╛рдлреЛрд░, рдЕрд╡рд░реЛрдзрдХ рдХрддрд╛рд░реЛрдВ рдФрд░ рдЕрдиреНрдп рд╕рдорд╛рди рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬреБрдбрд╝реА рд╣реЛрддреА рд╣реИрдВ,
рдЬреЛ рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рд╕реНрдЯреНрд░реАрдо рдХреЛ рдмреНрд▓реЙрдХ рдХрд░ рджреЗрддрд╛ рд╣реИ рдЕрдЧрд░ рдЬрд╛рдирдХрд╛рд░реА рдЕрднреА рддрдХ рдирд╣реАрдВ рдЖрдИ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реНрдЯреНрд░реАрдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреБрд▓-рдЖрдзрд╛рд░рд┐рдд рдСрдкрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИред
рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ - рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рдХреЗрд╡рд▓ рддрдм рддрдХ рдирд┐рд╖реНрдкрд╛рджрди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рддреИрдпрд╛рд░ рди рд╣реЛ рдЬрд╛рдПред
рд╡реЗ рддрдм рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рд╕реВрдЪрдирд╛ рдкреНрд░рджрд╛рддрд╛ рдЦреБрдж рдЗрд╕реЗ рдПрдХ рдкреБрд╢-рдЖрдзрд╛рд░рд┐рдд рдСрдкрд░реЗрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд░рд┐рдд рди рдХрд░реЗрдВред
рдЗрд╕рдХреЗ рдХрд╛рд░рдг, рд╡реЗ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╕рдордп рд╕реНрдЯреИрдХ рдкрд░ рдореЗрдореЛрд░реА рдЦрд░реНрдЪ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рд▓рд┐рдП, рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдереНрд░реЗрдбреНрд╕ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдХрдо рдореЗрдореЛрд░реА рд▓реЗрддреЗ рд╣реИрдВред
- рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕рд╛рде рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, рдЙрдирдХреЗ рдЙрдк-рд╡рд┐рд╖рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП - рдкреИрд░рд╛рдореАрдЯрд░: рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рдХреЗ рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдкрддрд╛ рд╕реВрдЪрдирд╛ рдкреНрд░рджрд╛рддрд╛ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдкреНрд░реЗрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
CompletableFuture
рддрд░реАрдХреЛрдВ рдХрд╛ рд╕реЗрдЯ рдареАрдХ рдпрд╣реА рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЖрдк рдЗрди рддрд░реАрдХреЛрдВ рдХреЗ рдмрд┐рдирд╛ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрдирд╛рдХрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрди рд╡рд░реНрдЧреЛрдВ рдХреЗ рд╕рдорд╛рди рд╡рд░реНрдЧ рд╣реЛрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЗрди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ, java.util.concurrent
рдХреЗ рд░рдЪрдирд╛рдХрд╛рд░реЛрдВ рдиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЗрди рдХрдХреНрд╖рд╛рдУрдВ рддрдХ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рджреЗрдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ CompletableFuture
рдХреЛрдб рдХреА рдЧрд╣рд░рд╛рдИ рдореЗрдВ CompletableFuture
рдХреЗ рд▓рд┐рдП рдЪреБрдирд╛ред
рдЬреЛ рд▓реЛрдЧ рдмрдирд╛рдП рдЬрд╛ рд░рд╣реЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛ рджреГрд╢реНрдп рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╡реЗ рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реБрдП рдЗрди рд╡рд░реНрдЧреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╕рдВрдЧрдард┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб Github рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ ред