バックグラウンドでタスクを動かしている状態でJavaFXの画面を閉じる。
すると、裏で走っていたTaskが終わった後もなんか生き残っている。
環境は1.7.0_45に入っているjfxrt.jarでEclipse実行。
ソースは下の感じ。
@FXML private void handleExecAction(ActionEvent event) { this.logger.info("start"); try { analizeTask = getAnalizeTask(); pgBar.progressProperty().unbind(); pgBar.progressProperty().bind(analizeTask.progressProperty()); pgLabel.textProperty().bind(analizeTask.messageProperty()); final ExecutorService exe = Executors.newSingleThreadExecutor(); exe.submit(analizeTask); private Task<String> getAnalizeTask() { return new Task<String>() { @Override protected String call() throws Exception { logger.info("start"); try {
とりあえずは、
- Applicationクラスにコントローラー持たしておいて
- stopメソッドからコントローラーの終了メソッドを呼んで
- その中からTaskのcancel呼んで
- Taskのキャンセルイベントのハンドラー内で強制終了かけてやる
で回避。
Task内の終了処理をきちんとやろうとするといろいろはまりそうですが。
1
private FXMLController controller; @Override public void start(Stage stage) throws Exception { FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/fxml/Scene.fxml")); Parent root = (Parent) fxmlLoader.load(); controller = (FXMLController) fxmlLoader.getController();
2
@Override public void stop() throws Exception { controller.destroy(); }
3
public class FXMLController implements Initializable { public void destroy() { if (analizeTask != null) analizeTask.cancel(); }
4
analizeTask.addEventHandler(WorkerStateEvent.WORKER_STATE_CANCELLED, new EventHandler<WorkerStateEvent>() { @Override public void handle(WorkerStateEvent t) { exe.shutdown(); } });