Java 为什么CompletableFuture有时会陷入try块跳过操作代码中?
我是JavaFX新手,我对服务有一个问题。我正在尝试从文件中读取数据,如果5秒后我的任务未完成,我想抛出TimeOutException: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
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的线程也从未停止。