Java 中的反弹操作方式是两个表达式传达给另两个表达式并在某一操作方式顺利完成后继续执行。反弹能并行继续执行,也能触发器继续执行。在并行反弹的情况下,两个表达式紧接著另两个继续执行。在触发器反弹的情况下,两个表达式在几段不确认的天数后继续执行,因此与其他表达式没某一的次序出现。
责任编辑从Observable程序语言中反弹做为H55N的经典之作范例已经开始,向我们如是说Java中的反弹。接下去您将看见各式各样并行和触发器反弹同时实现的实例,主要包括CompletableFuture。
并行反弹
并行反弹表达式将仍旧在继续执行这类操作方式后立刻继续执行。这意味著它将与继续执行该操作方式的表达式并行进行。
并行反弹-非官方外部类反弹
每每他们将暗含方式同时实现的USB传达给Java中的另两个方式时,他们都在采用反弹表达式的基本概念。在上面的实例中,他们将透过Consumer机能USB和两个非官方外部Canillac同时实现该accept()方式。
除非accept()方式被同时实现,将从该方式继续执行姿势execute()方式。
package com.joyce.callback; import java.util.function.Consumer; public class AnonymousInnerClassCallback { public static void main(String[] args) { execute(new Consumer<String>() { @Override public void accept(String s) { System.err.println(s); } }); } public static void execute(Consumer<String> consumer) { System.err.println(“Action is being execute…”); consumer.accept(“Callback is execute…”); } }此代码的继续执行结果如下图所示:
在这段代码中,他们将ConsumerUSB传达给execute()方式,然后accept()在操作方式顺利完成后调用方式。
您可能注意到采用非官方外部类,代码非常冗长。那么接下去让他们看看,改造采用lambda表达式用于他们的反弹表达式时会出现什么。
并行反弹-Lambda反弹
在Java中,他们能用lambda表达式同时实现表达式式USB并将其传达给方式,然后在操作方式顺利完成后继续执行该表达式。实例如下图:
package com.joyce.callback; public class LambdaCallback { public static void main(String[] args) { execute(() -> System.err.println(“Callback function execute…”)); } public static void execute(Runnable runnable) { System.err.println(“Action is being execute…”); runnable.run(); } }此代码的继续执行结果如下图所示:
在此实例中,您可能会注意到他们Runnable在execute()方式中传达了机能USB。因此,他们能够在方式run()的操作方式execute()方式顺利完成后覆盖并继续执行该方式。
触发器反弹
通常,他们希望采用触发器反弹方式。这意味著将在操作方式之后调用但与其他进程触发器调用方式。当不需要在其他进程之后立刻调用反弹方式时,这可能有助于提高性能。
触发器反弹-简单线程反弹
让他们从进行触发器反弹调用操作方式的最简单方式已经开始。在上面的实例代码中,首先他们将从机能USB同时实现run()方式。然后,他们将创建两个Thread并采用run()方式。最后,他们将已经开始Thread触发器继续执行。
package com.joyce.callback; public class AsyncThreadCallback { public static void main(String[] args) { Runnable runnable = () -> System.err.println(“Callback executed…”); AsyncThreadCallback asynchronousCallback =new AsyncThreadCallback(); asynchronousCallback.executeAsync(runnable); } public void executeAsync(Runnable runnable) { new Thread(() -> { System.err.println(“Processing Async Task…”); runnable.run(); }).start(); } }此代码的继续执行结果如下图所示:
注意,在上面的代码中,他们首先为run()方式创建了两个Runnable同时实现。然后,他们调用executeAsync()方式,将runnable机能USB与run()方式同时实现一起传达。
executeAsync()传达USB并采用 lambdaRunnable同时实现另两个RunnableUSB。Thread打印“Processing Async Task…” 最后,他们调用他们透过参数传达的反弹表达式run,打印“Callback executed…”
触发器反弹-并行反弹
除了在触发器操作方式中调用反弹表达式外,他们还能在调用另两个表达式的同时调用反弹表达式。这意味著他们能启动两个线程并行调用这些方式。
代码将与前面的实例类似,但请注意,他们将启动两个新线程并在这个新线程中调用反弹表达式,而不是直接调用反弹表达式:
package com.joyce.callback; public class AsyncParallelCallback { public static void main(String[] args) { Runnable runnable = () -> System.err.println(“Callback executed…”); AsyncParallelCallback asyncParallelCallback =newAsyncParallelCallback(); asyncParallelCallback.executeAsync(runnable); }public void executeAsync(Runnable runnable) { new Thread(() -> { System.err.println(“Processing Async Task…”); new Thread(runnable).start(); }).start(); } }此代码的继续执行结果如下图所示:
当他们不需要在executeAsync()方式的操作方式之后立刻继续执行反弹表达式时,触发器并行反弹很有用。
两个真实的范例,当他们在线购买产品时,他们不需要等到确认付款、检查库存以及所有那些繁重的流程。在这种情况下,他们能在后台继续执行反弹调用的同时做其他事情。
CompletableFuture 反弹
采用触发器反弹表达式的另一种方式是采用CompletableFuture API。这个强大的API在Java 8中引入,有助于继续执行和组合触发器方式调用。它顺利完成了他们在前面的实例中所做的一切,例如创建两个新的Thread然后启动和管理它。
在上面的代码实例中,他们将创建两个新的CompletableFuture,然后他们将调用supplyAsync()方式传达的方式String。
接下去,他们将创建另两个,CompletableFuture将thenApply两个反弹表达式与他们配置的第两个表达式一起继续执行。
packagecom.joyce.callback;import java.util.concurrent.CompletableFuture; public class CompletableFutureCallback { public static void main(String[] args) throws Exception { CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() ->“Supply Async…”); CompletableFuture<String> execution = completableFuture .thenApply(s -> s +” Callback executed…”); System.err.println(execution.get()); } }此代码的继续执行结果如下图所示:
结论
反弹在软件开发中无处不在,广泛用于工具、程序语言和应用程序中。有时他们会在不知不觉中采用它们。
他们已经如是说了各式各样常见的反弹同时实现,以帮助展示它们在Java代码中的实用性和多机能性。以下是需要记住的反弹的一些特性:
反弹表达式应该在继续执行另两个姿势时或与继续执行该姿势并行继续执行。反弹表达式能是并行的,这意味著它必须在其他操作方式之后立刻继续执行,没任何延迟。反弹表达式能是触发器的,这意味著它能在后台继续执行,因此可能需要一些天数才能继续执行。Observable 程序语言采用反弹在姿势出现时通知感兴趣的实体。