Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么CompletableFuture有时会陷入try块跳过操作代码中?_Java_Multithreading_Javafx_Service_Task - Fatal编程技术网

Java 为什么CompletableFuture有时会陷入try块跳过操作代码中?

Java 为什么CompletableFuture有时会陷入try块跳过操作代码中?,java,multithreading,javafx,service,task,Java,Multithreading,Javafx,Service,Task,我是JavaFX新手,我对服务有一个问题。我正在尝试从文件中读取数据,如果5秒后我的任务未完成,我想抛出TimeOutException: public Service<Void> readFile() { return new Service<Void>() { @Override protected Task<Void> createTask() { return new Task<Vo

我是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;
                }
            };
        }
    };
}
公共服务读取文件(){
返回新服务(){
@凌驾
受保护的任务createTask(){
返回新任务(){
@凌驾
受保护的Void调用()引发异常{
CompletableFuture=CompletableFuture.runAsync(()->{
System.out.println(“尝试读取数据…”);
//通过文件读取数据;
});
试一试{
future.get(5,时间单位秒);
}捕获(TimeoutException te){
System.out.println(“超时!”);
抛出新的TimeoutException();
}
返回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();
    }
}
void readingFile(ActionEvent事件){
试一试{
父根=FXMLLoader.load(getClass().getResource(“loading.fxml”);
Scene Scene=startBtn.getScene();
root.translateProperty().set(scene.getWidth());
parent.getChildren().add(根目录);
时间线=新时间线();
KeyValue KeyValue=新的KeyValue(root.translateProperty(),0,Interpolator.EASE_-IN);
KeyFrame KeyFrame=新的关键帧(持续时间.millis(100),keyValue);
timeline.getKeyFrames().add(keyFrame);
timeline.setOnFinished(事件1->{
parent.getChildren().remove(容器);
Label Label=(Label)root.lookup(“#Label”);
服务readTask=readFile();
label.textProperty().unbind();
label.textProperty().bind(readTask.messageProperty());
readTask.start();
readTask.setOnFailed(失败->{
System.out.println(“读取文件失败!重试…”);
readTask.restart();
});
readTask.setOnSucceed(成功->{
System.out.println(“成功”);
新线程(writeFile()).start();
});
});
timeline.play();
}捕获(IOE异常){
e、 printStackTrace();
}
}

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

单词“Future”字面意思是未来,而不是JET,这就是为什么“它跳过读取数据代码并立即尝试阻塞”的原因。也许这个帖子可以帮你走出迷宫@Joe谢谢你的回答。JavaFx有没有更好的方法来实现任务的超时而不需要CompletableFuture?如果在五秒钟内没有读取完整的文件,为什么要重新开始读取文件?如果文件读取未在第一次尝试后的五秒钟内完成,那么在五秒钟内完成读取的机会有多大?重新启动任务后,通过usb连接的电路板,我在文件中获取新数据。有时电路板不能用新字节完成文件,而文件是空的,这就是为什么我要等待5秒钟。这不一定与您的问题有关,但请注意,即使发生超时,实际执行I/O的线程也从未停止。