我是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。为什么会发生这种情况,我该如何解决?提前谢谢。
暂无答案!
目前还没有任何答案,快来回答吧!