JavaFXアプリケーションを使用して、別のプロセス(updater executable)を実行して終了する必要があります。 私はProcessBuilder.command()
を使って別のプロセスを実行しています。サブプロセスが!isAlive()
になると、プロセスが完全に実行されます。その後、Window.getWindows().forEach(::dispose)
とSystem.exit(0)
を実行してアプリケーションを終了しようとしています。JavaFXアプリケーションは、System.exit()の後に終了しません。
System.exit(0)
を呼び出した後、アプリケーションがハングしますが、別のプロセスが実行されていない場合、アプリケーションは正しく終了します。
"JavaFXアプリケーションスレッド" #32 PRIO = 5 os_prio = 0 TID = 0x000000001f4fe000 NID = 0x44d0はObject.waitにおける() [0x0000000023f4d000]のJava:ここ
はメインスレッドのスタックトレースの一部です。 lang.Thread.State:java.lang.Object.wait(ネイティブメソッド)のawlting(オブジェクト モニタ) java.lang.Thread.join(Thread.java:1252) - locked < 0x00000006c21ac608> .lang.Thread)を でjava.lang.Thread.join(Thread.java:1326)に設定します。java.lang.ApplicationShutdownHooks.runHooks(ApplicationShutdownHooks.java:106) java.lang.ApplicationShutdownHooks $ 1.run(ApplicationShutdownHooks.java:46) java.lang.Shutdown.sequenceでjava.lang.Shutdown.runHooks(Shutdown.java:123)で で(Shutdown.java:167) java.lang.Shutdown.exit(Shutdown.java:212) - ロックされた< 0x00000006c2148fb8>(java.lang.Class.Shutdown)、java.lang.Runtime.exit(Runtime.java:109) ) java.lang.System.exit(System.java:971)で
そこで一部ApplicationShutdownHooks
完了するためのアプリケーションを待機です。 アプリケーションに2つのフックが追加されましたが、削除した後も、stacktraceは同じままです。
暗黙的にどのようなフックを追加できますか?サブプロセスが終了する前に別のプロセスを別の方法で実行して終了する必要があるかもしれませんか?
UPD:このアプリケーションは実際には完全なJavaFXアプリケーションではなく、JavaFX部分を含むAWTアプリケーションです。
JavaFXアプリケーションで 'System.exit'が許可されていないという文書はありません。あなたが投稿したリンクは、実際にはライフサイクルの一環としてSystem.exit()について話しています。 – Thirler
Platform.exit()を使用する必要があるとは言わず、使用することをお勧めします。 System.exit()のみを他のJavaアプリケーションと同じように使用できます。 Platform.exit()はよりクリーンなexit()メソッドを持ち、終了する前にすべての問題を派生スレッドのように解決する必要があります。 – LMiranda