2017-02-01 15 views
1

内の他のスレッドのJavaFXのを終了していない、 このコードは8つのアクティブスレッドを示しています。Platform.exit()ので、私はそれを閉じたいとき、私は複数のアクティブなスレッドを持っていたJavaFX 8アプリを持っているOSX

ThreadGroup group = Thread.currentThread().getThreadGroup(); 
    LOG.debug("Number of active threads = " + group.activeCount()); 

Platform.exit();Platform.setImplicitExit(true);を使用しても、きれいな出口が得られません。

Platform.exit();を呼び出す前または後にすべてのスレッドを強制終了しようとしましたが、成功しませんでした。

割り込み前にスレッドをデーモンとして設定しても解決しませんでした。他のアプリは他のアプリまたはスタンドアロン内から起動できるようSystem.exit(0)を呼び出す

 while (group != null) { 
     group.setDaemon(true); 
     group.interrupt(); 
     group = Thread.currentThread().getThreadGroup(); 
    } 

は、ここではオプションではありません。

終了前に表示されるエラーはNot on FX application thread; currentThread = JavaFX Application Threadです。

編集1:エラーのスタックトレース:

ERROR SimpleUncaughtExceptionHandler.java uncaughtException 34  [JavaFX Application Thread] Uncaught exception 
java.lang.IllegalStateException: Not on FX application thread; currentThread = JavaFX Application Thread 
    at com.sun.javafx.tk.Toolkit.checkFxUserThread(Toolkit.java:236) ~[jfxrt.jar:?] 
    at com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(QuantumToolkit.java:423) ~[jfxrt.jar:?] 
    at javafx.stage.Window.setShowing(Window.java:921) ~[jfxrt.jar:?] 
    at javafx.stage.Window.hide(Window.java:947) ~[jfxrt.jar:?] 
    at com.sun.javafx.stage.WindowPeerListener.closed(WindowPeerListener.java:100) ~[jfxrt.jar:?] 
    at com.sun.javafx.tk.quantum.GlassWindowEventHandler.run(GlassWindowEventHandler.java:118) ~[jfxrt.jar:?] 
    at com.sun.javafx.tk.quantum.GlassWindowEventHandler.run(GlassWindowEventHandler.java:40) ~[jfxrt.jar:?] 
    at java.security.AccessController.doPrivileged(Native Method) ~[?:1.8.0_121] 
    at com.sun.javafx.tk.quantum.GlassWindowEventHandler.lambda$handleWindowEvent$423(GlassWindowEventHandler.java:150) ~[jfxrt.jar:?] 
    at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389) ~[jfxrt.jar:?] 
    at com.sun.javafx.tk.quantum.GlassWindowEventHandler.handleWindowEvent(GlassWindowEventHandler.java:148) ~[jfxrt.jar:?] 
    at com.sun.glass.ui.Window.handleWindowEvent(Window.java:1266) ~[jfxrt.jar:?] 
    at com.sun.glass.ui.Window.notifyDestroy(Window.java:1183) ~[jfxrt.jar:?] 

編集2:アクティブなスレッドの一覧:

DEBUG [JavaFX Application Thread]  isDeamon : false; name : main 
DEBUG [JavaFX Application Thread]  isDeamon : true; name : QuantumRenderer-0 
DEBUG [JavaFX Application Thread]  isDeamon : false; name : JavaFX-Launcher 
DEBUG [JavaFX Application Thread]  isDeamon : true; name : URL-Loader-2 
DEBUG [JavaFX Application Thread]  isDeamon : true; name : URL-Loader-1 
DEBUG [JavaFX Application Thread]  isDeamon : true; name : JavaFX Application Thread 
DEBUG [JavaFX Application Thread]  isDeamon : true; name : Java2D Queue Flusher 
DEBUG [JavaFX Application Thread]  isDeamon : true; name : Prism Font Disposer 
DEBUG [JavaFX Application Thread]  isDeamon : true; name : Reference Handler 
DEBUG [JavaFX Application Thread]  isDeamon : true; name : Thread-6 
DEBUG [JavaFX Application Thread]  isDeamon : false; name : AWT-Shutdown 
DEBUG [JavaFX Application Thread]  isDeamon : true; name : Java2D Disposer 
DEBUG [JavaFX Application Thread]  isDeamon : true; name : Signal Dispatcher 
DEBUG [JavaFX Application Thread]  isDeamon : true; name : Disposer 
DEBUG [JavaFX Application Thread]  isDeamon : true; name : Finalizer 
DEBUG [JavaFX Application Thread]  isDeamon : false; name : AWT-EventQueue-0 
DEBUG [JavaFX Application Thread]  isDeamon : true; name : Thread-5 
DEBUG [JavaFX Application Thread]  isDeamon : true; name : Timer-0 
+0

「クリーンな出口を得られない」とはどういう意味ですか? – DVarga

+0

'FXアプリケーションスレッドではありません。'例外なしで終了します。 – josephino

+4

@GltknBtn 'thread.stop()'、** ever **を使わないでください。 [本質的に安全ではありません](http://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#stop--)、廃止されました。 –

答えて

1

この問題とOSX System menubar not working in JavaFXは、スプラッシュスクリーンで同じ根本的な原因を持っています私は "java -splash:.."を使用していますが、これを無効にすると問題が解決します。

スプラッシュスクリーンはAWTフィーチャーであり、JavaFXフィーチャーではないため、AWTイベントスレッド内で起動され、JavaFXイベントスレッドでは起動されていないようです。

splash screenJavaFXは、アプリケーション内からJavaFX Paneとして実装する必要があります。

+1

[虫を報告する](http://bugreport.java.com) 。 – jewelsea

+0

@jewelsea JavaFXでSplashScreenを使用しないでください。代わりにPreloaderを使用してください。 – josephino

+0

@jewelseaあなたが正しく、バグが報告されました:http://bugs.java.com/bugdatabase/view_bug.do?bug_id= JDK-8175977 – josephino

関連する問題