Java.util.concurrent.CompletableFuture рд╡рд░реНрдЧ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЧрд╛рдЗрдб

Java рдореЗрдВ рд╢реБрд░реВ рдХреА рдЧрдИ рдХрдВрдкреНрд▓реАрдЯрдЯреЗрдмрд▓ рд╕реАрд╡рди рдХреНрд▓рд╛рд╕ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдзрд╛рдЧреЛрдВ рдХреЗ рдмреАрдЪ рд╕реВрдЪрдирд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдХрд░рдг рд╣реИред рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ, рдпрд╣ рдПрдХ рдЕрд╡рд░реБрджреНрдз рдХрддрд╛рд░ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рдПрдХ рд╕рдВрджрд░реНрдн рдорд╛рди рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИред рдПрдХ рдирд┐рдпрдорд┐рдд рдХрддрд╛рд░ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдпрд╣ рдПрдХ рдЕрдкрд╡рд╛рдж рднреА рдлреЗрдВрдХрддрд╛ рд╣реИ рдпрджрд┐ рдпрд╣ рд╕рдВрдЪрд░рд┐рдд рдореВрд▓реНрдп рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╕рдордп рд╣реБрдЖред

рдХрдХреНрд╖рд╛ рдореЗрдВ рдХрдИ рджрд░реНрдЬрди рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реЛрддреА рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдЦреЛ рдЬрд╛рдирд╛ рдЖрд╕рд╛рди рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдЖрд▓реЗрдЦ рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХрдИ рдорд╛рдирджрдВрдбреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╡рд░реНрдЧреАрдХреГрдд рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╡реЗ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реЛрдВред

рд╡рд╛рд░реНрдо рдЕрдк рдХреЗ рд▓рд┐рдП, рд╣рдо java.util.Function рдкреИрдХреЗрдЬ рд╕реЗ рдирдП рдЗрдВрдЯрд░рдлреЗрд╕ рдкреЗрд╢ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдХрдИ рддрд░реАрдХреЛрдВ рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

//  ,   BiFunction<T, U,R> { R apply(T t, U u); } //  ,    BiConsumer<T,U> { void accept(T t, U u) } //  ,   Function<T, R> { R apply(T t); } //  ,    Consumer<T> { void accept(T t); } //  ,   Supplier<T> { T get(); } 

рдЕрдЪреНрдЫреЗ рдкреБрд░рд╛рдиреЗ рд░рдирдиреЗрдмрд▓ рдХреЛ рднреА рдпрд╛рдж рдХрд░реЗрдВ:
 //  ,    Runnable { void run(); } 

рдпреЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдпрд╛ рд▓реИрдореНрдмреНрдбрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рджреЛрдиреЛрдВ рдХреЗ рд╕рд╛рде рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рдзрди рдХреЗ рд░реВрдк рдореЗрдВ, CompletableFuture рдХреНрд▓рд╛рд╕ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдФрд░ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдЙрдк-рдЗрдВрдЯрд░рдлреЗрд╕ рд╣реИрдВ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рдкреНрд░рддреНрдпрдХреНрд╖ (рд╕рд┐рдВрдХреНрд░реЛрдирд╕) рдФрд░ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ (рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ) рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реИрдВред рдХреЗрд╡рд▓ рдбрд╛рдпрд░реЗрдХреНрдЯ-рд░реАрдбрд┐рдВрдЧ рд╕рдм-рдЗрдВрдЯрд░рдлрд╝реЗрд╕ ( java.util.concurrent.Future , рдЬрд╛рд╡рд╛ 5 рдХреЗ рд╕рдордп рд╕реЗ рдореМрдЬреВрджрд╛) рдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХ рд░реВрдк рд╕реЗ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд░реНрдЧреАрдХрд░рдг рдкреНрд░рдпреЛрдЬрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдмрд╛рдХреА рдХреЛ рдорд╛рдирд╕рд┐рдХ рд░реВрдк рд╕реЗ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИред рдЙрдк-рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдЗрд╕ рдкреГрдердХреНрдХрд░рдг рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдЙрди рдмреБрдирд┐рдпрд╛рджреА рддрд░реАрдХреЛрдВ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреА рднреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдЬреЛ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред

рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдХреЗ рд▓рд┐рдП, "рдХрдВрдкреНрд▓реАрдЯрдЯреЗрдмрд▓ рдлрд╛рдЙрдиреНрдбреЗрд╢рди рдХреА рд╡рд╕реНрддреБ" рдХреЗ рдмрдЬрд╛рдп рд╣рдо "рдлреНрдпреВрдЪрд░" рдХрд╣реЗрдВрдЧреЗред "рдпрд╣ рдлреНрдпреВрдЪрд░реНрд╕" рдХрд╛ рдЕрд░реНрде рд╣реИ рд╡рд╛рдпрджрд╛ рдЬрд┐рд╕рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╡рд┐рдзрд┐ рд▓рд╛рдЧреВ рдХреА рдЬрд╛рдПрдЧреАред

1. рдбрд╛рдпрд░реЗрдХреНрдЯ рд░рд┐рдХреЙрд░реНрдб рдЗрдВрдЯрд░рдлрд╝реЗрд╕


рджреЛ рдмреБрдирд┐рдпрд╛рджреА рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВ, рдмреЗрд╢рдХ - рдореВрд▓реНрдп рд▓рд┐рдЦреЗрдВ рдФрд░ рдЕрдкрд╡рд╛рдж рд▓рд┐рдЦреЗрдВ:
 boolean complete(T value) boolean completeExceptionally(Throwable ex) 
рд╕реНрдкрд╖реНрдЯ рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рд╕рд╛рдеред

рдЕрдиреНрдп рддрд░реАрдХреЗ:

 boolean cancel(boolean mayInterruptIfRunning) 
рд╕рдорддреБрд▓реНрдп completeExceptionally(new CancellationException) ред Java.util.concurrent.Future рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдЪрдпред

 static <U> CompletableFuture<U> completedFuture(U value) 
CompletableFuture res=new CompletableFuture(); res.complete(value) рдмрд░рд╛рдмрд░ CompletableFuture res=new CompletableFuture(); res.complete(value) CompletableFuture res=new CompletableFuture(); res.complete(value) ред

 void obtrudeValue(T value) void obtrudeException(Throwable ex) 
рд╕рдВрдЧреНрд░рд╣реАрдд рдореВрд▓реНрдп рдХреЛ рдЬрдмрд░рди рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░ рджреЗрддрд╛ рд╣реИред рдкреИрд░ рдореЗрдВ рдЦреБрдж рдХреЛ рдЧреЛрд▓реА рдорд╛рд░рдиреЗ рдХрд╛ рдЕрдЪреВрдХ рддрд░реАрдХрд╛ред

2. рдкреНрд░рддреНрдпрдХреНрд╖ рдкрдврд╝рдиреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕


 boolean isDone() 
рдЪреЗрдХ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдкрд░рд┐рдгрд╛рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рд╡рд╛рдпрджреЗ рдХреЛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред

 T get() 
рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ рдкрд░рд┐рдгрд╛рдо рдЕрднреА рддрдХ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдПрдХ рдирд┐рд╖реНрдкрд╛рджрди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИред

рдЕрдиреНрдп рддрд░реАрдХреЗ:

 boolean isCancelled() 
рдпрджрд┐ рдХреЛрдИ рдЕрдкрд╡рд╛рдж рд░рджреНрдж () рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИред

 T join() 
рд╕рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдорд┐рд▓рддрд╛ рд╣реИ (), рд▓реЗрдХрд┐рди рдПрдХ рдХрдВрдкреНрд▓реАрдЯ рдПрдХреНрд╕рдХреНрд╕реЗрдкреНрд╢рди рдлреЗрдВрдХрддрд╛ рд╣реИред

 T get(long timeout, TimeUnit unit) 
рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЗ рд╕рд╛рде get() ред

 T getNow(T valueIfAbsent) 
рддреБрд░рдВрдд рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рдкрд░рд┐рдгрд╛рдо рдЕрднреА рддрдХ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ valueIfAbsent рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИред

 int getNumberOfDependents() 
рдЗрд╕реЗ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рдЕрдиреНрдп рдХрдВрдкреНрд▓реАрдЯреЗрдмрд▓ рдлрд╝реЙрдЗрд▓ рдХреА рдЕрдиреБрдорд╛рдирд┐рдд рд╕рдВрдЦреНрдпрд╛ред

3. рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдЗрдВрдЯрд░рдлрд╝реЗрд╕


 static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier) 
рдЖрдкреВрд░реНрддрд┐рдХрд░реНрддрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдп рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╡рд╛рдпрджрд╛ рдХреЛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдХрд╛рд░реНрдп рдПрдХ рдорд╛рдирдХ рдереНрд░реЗрдб рдкреВрд▓ рдкрд░ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

 static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier, Executor executor) 
рдПрдХ рд╣реА рдмрд╛рдд, рд▓реЗрдХрд┐рди рдирд┐рд╖реНрдкрд╛рджрдХ рдкреИрд░рд╛рдореАрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдереНрд░реЗрдб рдкреВрд▓ рдкрд░ рд╢реБрд░реВ рдХрд░рдирд╛ред

 static CompletableFuture<Void> runAsync(Runnable runnable) static CompletableFuture<Void> runAsync(Runnable runnable, Executor executor) 
рдЬреИрд╕рд╛ рдХрд┐ supplyAsync , рд▓реЗрдХрд┐рди рд╕реНрдЯреЙрдХ рдЯрд╛рдЗрдк Runnable рдФрд░, рддрджрдиреБрд╕рд╛рд░, рдкрд░рд┐рдгрд╛рдо рдкреНрд░рдХрд╛рд░ Void ред

4. рдордзреНрдпрд╕реНрдерддрд╛ рдкрдарди рдЗрдВрдЯрд░рдлрд╝реЗрд╕


рдЗрд╕ (рдФрд░ / рдпрд╛ рдЕрдиреНрдп) рд╡рд╛рдпрджрд╛ рдХреЛ рднрд░рдиреЗ рдкрд░ рддреБрд░рдВрдд рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдХрд╛рд░реНрдп (рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛) рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рд╡реНрдпрд╛рдкрдХ рдЙрдк-рдЗрдВрдЯрд░рдлрд╝реЗрд╕ред рд╣рдо рдЗрд╕рдХреЗ рдШрдЯрдХреЛрдВ рдХреЛ рджреЛ рд╕рдВрдХреЗрддреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╡рд░реНрдЧреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВ:

a) рдПрдХ рднрд░рдиреЗ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛: рдлреНрдпреВрдЪрд░реНрд╕ рдХреЛ рднрд░рддреЗ рд╕рдордп, рдпрд╛ рдереНрд░реЗрдб рдкреВрд▓ рдкрд░ рдХрд╛рд░реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реВрдк рд╕реЗ рдЗрд╕реЗ рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред рдПрдХ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╢реБрд░реБрдЖрдд рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░рддреНрдпрдп Async рдХреЗ рд╕рд╛рде рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рджреЛ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ, рд╕рд╛рдорд╛рдиреНрдп рдереНрд░реЗрдб ForkJoinPool.commonPool() рдкрд░ рд╢реБрд░реВ ForkJoinPool.commonPool() , рдпрд╛ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреИрд░рд╛рдореАрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕реНрдЯреНрд░реАрдо рдкрд░)ред рдХреЗрд╡рд▓ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рд╡рд┐рдзрд┐рдпрд╛рдБ рдиреАрдЪреЗ рдмрддрд╛рдИ рдЧрдИ рд╣реИрдВред

рдЦ) рдЗрд╕ рд╡рд╛рдпрджрд╛ рдФрд░ рдЙрд╕рдХреЗ рднрд░рдиреЗ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз рдХреА рдЯреЛрдкреЛрд▓реЙрдЬреА: рд░реИрдЦрд┐рдХ, "рдХреЛрдИ" рдЯрд╛рдЗрдк рдХрд░реЗрдВ рдФрд░ "рд╕рднреА" рдЯрд╛рдЗрдк рдХрд░реЗрдВред

- рд░реИрдЦрд┐рдХ рд╕рдВрдмрдВрдз: рдПрдХ рд╡рд╛рдпрджрд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдореВрд▓реНрдп рдмрдЪрд╛рддрд╛ рд╣реИ

- "рдХреЛрдИ рднреА" рд╡рд┐рдзрд┐ - рдЗрдирдкреБрдЯ рдкрд░ рджреЛ рдпрд╛ рдЕрдзрд┐рдХ рд╡рд╛рдпрджрд╛; рдлреНрдпреВрдЪрд░реНрд╕ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓рд╛ рдкрд╣рд▓рд╛ (рд╕рдордп рдореЗрдВ) рдкрд░рд┐рдгрд╛рдо рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ; рдЕрдиреНрдп рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рдЕрдирджреЗрдЦреА рдХреА рдЬрд╛рддреА рд╣реИ

- "рд╕рднреА" рд╡рд┐рдзрд┐ - рдЗрдирдкреБрдЯ рдкрд░ рджреЛ рдпрд╛ рдЕрдзрд┐рдХ рд╡рд╛рдпрджрд╛; рд╕рднреА рд╡рд╛рдпрджрд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдЬрдорд╛ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

4.1 рдЗрд╕ рд╡рд╛рдпрджрд╛ (рд░реИрдЦрд┐рдХ рд╕рдВрдмрдВрдз) рдХреЛ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░реЗрдВ

рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рддрддреНрдХрд╛рд▓реАрди рдЙрдкрд╕рд░реНрдЧ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдирд╛рдо рд╣реЛрддреЗ рд╣реИрдВ, рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрддрд╛ рд╣реИ - рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛, рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдо рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк CompletableFuture рдирдП рд╡рд╛рдпрджрд╛ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред рд╡реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВред

 <U> CompletableFuture<U> thenApply(Function<? super T,? extends U> fn) 
рдореБрдЦреНрдп рд╡рд┐рдзрд┐ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рджрд┐рдП рдЧрдП рд╡рд╛рдпрджрд╛ рд╕реЗ рдПрдХ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдореА рд╡рд╛рдпрджрд╛ рдХреЛ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

 CompletableFuture<Void> thenAccept(Consumer<? super T> block) 
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рджрд┐рдП рдЧрдП рд╡рд╛рдпрджрд╛ рд╕реЗ рдореВрд▓реНрдп рдорд┐рд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореВрд▓реНрдп рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП
рдкрд░рд┐рдгрд╛рдореА рдлреНрдпреВрдЪрд░реНрд╕ рдХрд╛ рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ Void ред

 CompletableFuture<Void> thenRun(Runnable action) 
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдПрдХ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдпрд╛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддреА рд╣реИред

Compute1..compute4 рдХреЛ рд╡рд┐рдзрд┐ рд╕рдиреНрджрд░реНрдн рджреЗрдВред рдЪрд░рдг рд╕реЗ рдЪрд░рдг рддрдХ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╣рд╕реНрддрд╛рдВрддрд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рд░реИрдЦрд┐рдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддреА рд╣реИ:
 supplyAsync(compute1) .thenApply(compute2) .thenApply(compute3) .thenAccept(compute4); 

рдЬреЛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдХреЙрд▓ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ
 compute4(compute3(compute2(compute1()))); 

 <U> CompletableFuture<U> thenCompose(Function<? super T, CompletableFuture<U>> fn) 
thenApply рд╕рдорд╛рди рд░реВрдк рд╕реЗ, рд▓реЗрдХрд┐рди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реНрд╡рдпрдВ рддреИрдпрд╛рд░ рдореВрд▓реНрдп рдХреЗ рдмрдЬрд╛рдп рд╡рд╛рдпрджрд╛ рдХрд░рддреА рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рдЬрдЯрд┐рд▓ рдЯреЛрдкреЛрд▓реЙрдЬреА рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

4.2 рдХрд┐рд╕реА рднреА рдлреНрдпреВрдЪрд░ рдХреЛ рдкреЙрдкреНрдпреБрд▓реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд┐рдПрдХреНрд╢рди рдХрд░реЗрдВ

 static CompletableFuture<Object> anyOf(CompletableFuture<?>... cfs) 
рдПрдХ рдирдпрд╛ рд╡рд╛рдпрджрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬреЛ cfs рдкреИрд░рд╛рдореАрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдкрд╛рд░рд┐рдд рдХрд┐рдП рдЧрдП рдХрд┐рд╕реА рднреА рд╡рд╛рдпрджрд╛ рд╕реЗ cfs ред рдкрд░рд┐рдгрд╛рдо рдкреВрд░реНрдг рд╡рд╛рдпрджрд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред

4.3 рджреЛ рд╡рд╛рдпрджрд╛ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХреЛ рдкреЙрдкреНрдпреБрд▓реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░реЗрдВ

рдореБрдЦреНрдп рд╡рд┐рдзрд┐:

 <U> CompletableFuture<U> applyToEither(CompletableFuture<? extends T> other, Function<? super T,U> fn) 
рдПрдХ рдирдпрд╛ рд╡рд╛рдпрджрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬреЛ рддрдм рднрд░рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдпрд╣ рд╡рд╛рдпрджрд╛ рдпрд╛ рд╡рд╛рдпрджрд╛ other рдкреИрд░рд╛рдореАрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдо рдкреВрд░реНрдг рд╡рд╛рдпрджрд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред

рд╡рд┐рдзрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ:
 CompletableFuture.anyOf(this, other).thenApply(fn); 

рдЕрдиреНрдп рджреЛ рд╡рд┐рдзрд┐рдпрд╛рдБ рдХреЗрд╡рд▓ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рднрд┐рдиреНрди рд╣реЛрддреА рд╣реИрдВ:

 CompletableFuture<Void> acceptEither(CompletableFuture<? extends T> other, Consumer<? super T> block) CompletableFuture<Void> runAfterEither(CompletableFuture<?> other, Runnable action) 

рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ 3 * рдпрд╛ рддреЛ рддрд░реАрдХреЗ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ (9 рдЦрд╛рддреЗ рдореЗрдВ рд▓реЗрдирд╛ * Async рд╡рд┐рдХрд▓реНрдк), рдЬрдм рдХреЛрдИ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛:
 <T> CompletableFuture<T> either(CompletableFuture<? extends T> other) { return CompletableFuture.anyOf(this, other); } 

рддрдм рдЗрди рд╕рднреА рддрд░реАрдХреЛрдВ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 f1.applyToEither(other, fn) == f1.either(other).thenApply(fn); f1.applyToEitherAsync(other, fn) == f1.either(other).thenApplyAsync(fn); f1.applyToEitherAsync(other, fn, executor) == f1.either(other).thenApplyAsync(fn, executor); f1.acceptEither(other, block) == f1.either(other).thenAccept(other); f1.runAfterEither(other, action) == f1.either(other).thenRun(action); 

рдЖрджрд┐ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╛ рддреЛ рдЕрдиреНрдп рд╕рдВрдпреЛрдЬрдиреЛрдВ рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

4.4 рджреЛ рд╡рд╛рдпрджрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░реЗрдВ

 <U,V> CompletableFuture<V> thenCombine(CompletionStage<? extends U> other, BiFunction<? super T,? super U,? extends V> fn) 
рдореБрдЦреНрдп рд╡рд┐рдзрд┐ред рдпрд╣ рдЗрдирдкреБрдЯ рдкрд░ рджреЛ рд╡рд╛рдпрджрд╛ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдо рд╕рдВрдЪрд┐рдд рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рдЬреЛ рджреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдПрдХ рдХрд╛рд░реНрдп рд╣реИред

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдЕрдиреНрдп рд╡рд┐рдзрд┐рдпрд╛рдВ рднрд┐рдиреНрди рд╣реИрдВ:

 <U> CompletableFuture<Void> thenAcceptBoth(CompletableFuture<? extends U> other, BiConsumer<? super T,? super U> block) 
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдПрдХ рдореВрд▓реНрдп рдирд╣реАрдВ рд▓реМрдЯрд╛рддреА рд╣реИ

 CompletableFuture<Void> runAfterBoth(CompletableFuture<?> other, Runnable action) 
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛрдИ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ рд▓реЗрддреА рд╣реИ рдФрд░ рдПрдХ рдорд╛рди рдирд╣реАрдВ рд▓реМрдЯрд╛рддреА рд╣реИ

4.5 рдХрдИ рдлреНрдпреВрдЪрд░ рдХреЛ рдкреЙрдкреНрдпреБрд▓реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд┐рдПрдХреНрд╢рди рдХрд░реЗрдВ

 static CompletableFuture<Void> allOf(CompletableFuture<?>... cfs) 
рдПрдХ рдХрдВрдкреНрд▓реАрдЯрдЯреЗрдмрд▓ рдлрд╝реЙрдЙрдВрдЯ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬреЛ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реВрдЪреА рдореЗрдВ рд╕рднреА рд╡рд╛рдпрджрд╛ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рдкреВрд░рд╛ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдПрдХ рд╕реНрдкрд╖реНрдЯ рджреЛрд╖ рдпрд╣ рд╣реИ рдХрд┐ рд╡рд╛рдпрджрд╛ рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рдгрд╛рдореА рд╡рд╛рдпрджрд╛ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

4.6ред рд░рдирдЯрд╛рдЗрдо рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдЕрд╡рд░реЛрдзрди

рдпрджрд┐ рдХрд┐рд╕реА рд╕реНрддрд░ рдкрд░ рд╡рд╛рдпрджрд╛ рдЕрд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЕрдкрд╡рд╛рдж рдХреЛ рд╡рд╛рдпрджрд╛ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдиреАрдЪреЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рддреНрд░реБрдЯрд┐ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдирд┐рд╖реНрдкрд╛рджрди рдкрд░ рд▓реМрдЯрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 CompletableFuture<T> exceptionally(Function<Throwable,? extends T> fn) 
рдпрджрд┐ рдпрд╣ рд╡рд╛рдпрджрд╛ рдЕрд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкрд░рд┐рдгрд╛рдореА рд╡рд╛рдпрджрд╛ fn рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рд╡рд╛рдпрджрд╛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкрд░рд┐рдгрд╛рдореА рд╡рд╛рдпрджрд╛ рд╕рдорд╛рди рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

 <U> CompletableFuture<U> handle(BiFunction<? super T,Throwable,? extends U> fn) 
рдЗрд╕ рдкрджреНрдзрддрд┐ рдореЗрдВ, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╣рдореЗрд╢рд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рд╡рд╛рдпрджрд╛ рд╕рд╛рдорд╛рдиреНрдп рдпрд╛ рдЕрд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реЛред рдпрджрд┐ рдкрд░рд┐рдгрд╛рдо r рд╕рд╛рде рд╡рд╛рдпрджрд╛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдорд╛рдкрджрдВрдбреЛрдВ (r, null) рдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЕрдЧрд░ рдпрд╣ рдЕрдкрд╡рд╛рдж рдкреВрд░реНрд╡ рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ, рддреЛ рдкреИрд░рд╛рдореАрдЯрд░ (null, ex) рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЗрд╕ рд╡рд╛рдпрджрд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдо рд╕реЗ рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдирд┐рдореНрди рдЙрджрд╛рд╣рд░рдг http://nurkiewicz.blogspot.ru/2013/05/java-8-definitive-guide-to.html рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 CompletableFuture<Integer> safe = future.handle((r, ex) -> { if (r != null) { return Integer.parseInt(r); } else { log.warn("Problem", ex); return -1; } }); 

рдпрд╣рд╛рдВ, future String рдпрд╛ рддреНрд░реБрдЯрд┐ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдкреВрд░реНрдгрд╛рдВрдХ рдореЗрдВ рдмрджрд▓ рджреЗрддреА рд╣реИ, рдФрд░ рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, -1 рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐, рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕рддреНрдпрд╛рдкрди рд╢реБрд░реВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП if (ex!=null) , рдХреНрдпреЛрдВрдХрд┐ r==null рджреЛрдиреЛрдВ рдЕрд╕рд╛рдорд╛рдиреНрдп рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдкреНрддрд┐ рдХреЗ рджреМрд░рд╛рди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ r==null рддреНрд░реБрдЯрд┐ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрджрд┐ рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд░реБрдЪрд┐ рджрд┐рдЦрд╛рдИ рдЬрд╛рддреА рд╣реИ, рддреЛ рдПрдХ рдирд┐рд░рдВрддрд░рддрд╛ рд╣реЛрдЧреАред

Source: https://habr.com/ru/post/In213319/


All Articles