为什么completablefuture有时会陷入try块跳过动作代码的境地?

dgtucam1  于 2021-06-30  发布在  Java
关注(0)|答案(0)|浏览(225)

我是javafx新手,我有一个关于服务的问题。我正在尝试从文件中读取数据,如果5秒后我的任务没有完成,我想抛出timeoutexception:

public Service<Void> readFile() {
    return new Service<Void>() {
        @Override
        protected Task<Void> createTask() {
            return new Task<Void>() {
                @Override
                protected Void call() throws Exception {
                    CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
                        System.out.println("Trying to read data...");
                        //read data though out a file;
                    });
                    try {
                        future.get(5, TimeUnit.SECONDS);
                    }catch (TimeoutException te) {
                        System.out.println("TIMEOUT!");
                        throw new TimeoutException();
                    }
                    return null;
                }
            };
        }
    };
}

然后转到onfailed方法重新启动服务,并一次又一次地执行此操作,直到失败为止。启动我的任务的方法在按下按钮后执行它。首先启动动画,如果完成,则启动任务:

void readingFile(ActionEvent event) {
    try {
        Parent root = FXMLLoader.load(getClass().getResource("loading.fxml"));
        Scene scene = startBtn.getScene();

        root.translateXProperty().set(scene.getWidth());
        parent.getChildren().add(root);

        Timeline timeline = new Timeline();
        KeyValue keyValue = new KeyValue(root.translateXProperty(), 0 , Interpolator.EASE_IN);
        KeyFrame keyFrame = new KeyFrame(Duration.millis(100), keyValue);
        timeline.getKeyFrames().add(keyFrame);

        timeline.setOnFinished(event1 -> {
            parent.getChildren().remove(container);
            Label label = (Label) root.lookup("#label");
            Service<Void> readTask = readFile();
            label.textProperty().unbind();
            label.textProperty().bind(readTask.messageProperty());
            readTask.start();
            readTask.setOnFailed(fail -> {
                System.out.println("Fail to read file! Retry...");
                readTask.restart();
            });
            readTask.setOnSucceeded(success -> {
                System.out.println("Success");
                new Thread(writeFile()).start();
            });
        });

        timeline.play();

    } catch (IOException e) {
        e.printStackTrace();
    }
}

但是,当我的任务重新启动时,它跳过读取的数据代码并立即落入try block,并且在5秒后一直抛出timeoutexception。为什么会发生这种情况,我该如何解决?提前谢谢。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题