Я хочу, чтобы пользователь дождался завершения вызова моего метода для загрузки файла, что может занять от 2 до 3 минут. Я создал новый поток для вызова метода и вызвал его внутри run()
метода. На основе возвращаемого значения должно отображаться сообщение, успешное или ошибочное. Следовательно, я должен был использовать join()
. Но это все еще зависает, так как пользовательский интерфейс все еще ожидает завершения вызова метода. Как я могу преодолеть эту проблему? (По сути, мне нужно использовать поток для пользовательского интерфейса, чтобы не зависать, и в то же время я хочу отобразить сообщение на основе возвращаемого значения метода)
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
processMsg.setText("Do not close. This may take few minutes...");
Thread t1 = new Thread(new Runnable(){
@Override
public void run() {
try {
ret = /*Method-call-which-takes-long-time*/
} catch (IOException ex) {
Logger.getLogger(JavaFXApplication1.class.getName()).log(Level.SEVERE, null, ex);
} catch (SQLException ex) {
Logger.getLogger(JavaFXApplication1.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
t1.start();
try {
t1.join();
} catch (InterruptedException ex) {
Logger.getLogger(JavaFXApplication1.class.getName()).log(Level.SEVERE, null, ex);
}
if (ret != null){
if (ret.equals("TRUE")){
pane.getChildren().remove(processMsg);
processMsg.setText("File downloaded at location: "+ chosenDir.getAbsolutePath());
pane.add(processMsg,0,11,2,1);
}
else{
pane.getChildren().remove(processMsg);
processMsg.setText(ret);
pane.add(processMsg,0,11,2,1);
}
}
}
});