在原始线程中的CompletableFuture完成时运行

时间:2019-02-03 20:27:53

标签: java

如何在创建CompletableFuture的原始线程中运行whenComplete中的CompletableFuture

    // main thread
    CompletableFuture
            .supplyAsync(() -> {
                // some logic here
                return null;
            }, testExecutorService);
            .whenComplete(new BiConsumer<Void, Throwable>() {
                @Override
                public void accept(Void aVoid, Throwable throwable) {
                // run this in the "main" thread 
                }
            });

1 个答案:

答案 0 :(得分:0)

JavaFx的扩展示例:

    button.setOnClick((evt) -> {
        // the handler of the click event is called by the GUI-Thread
        button.setEnabled(false);
        CompletableFuture.supplyAsync(() -> {
            // some logic here (runs outside of GUI-Thread)
            return something;
        }, testExecutorService);
        .whenComplete((Object result, Throwable ex) -> {
            // this part also runs outside the GUI-Thread
            if (exception != null) {
                // something went wrong, handle the exception 
                Platform.runLater(() -> {
                    // ensure we update the GUI only on the GUI-Thread
                    label.setText(ex.getMessage());
                });
            } else {
                // job finished successfull, lets use the result
                Platform.runLater(() -> {
                    label.setText("Done");
                });
            }
            Platform.runLater(() -> {
                button.setEnabled(true); // lets try again if needed
            });
        });
    });

在这种情况下,这不是您可以编写的最佳代码,但是应该可以理解这一点。