JavaFxフレームワークを使用しているため、グラフィック操作を実行する必要がある単純なコンソールアプリケーションがあります(テキストのcssスタイリングのように必要な機能がいくつかあります)。いくつかの形状とテキストを非表示のシーンに生成して保存しますファイルにあるもの、それだけです。
JavaFx を操作するには、グラフィックス操作を JavaFx スレッドに渡す必要があることを知っていますが、すべてが完了してアプリケーションを閉じる必要がある場合 (数時間後)、この JavaFx スレッドはまだ開いたままです...そして、私は本当にそうしませんSystem.exit() で強制的に終了したいのは、何かがブロックされている場合は知りたい/待ちたいからです (また、すべてを JavaFx アプリケーションとして実行したくない (JavaFx コンポーネントはメイン アプリケーションの 1% 未満であるため))
コードは非常にシンプルで、グーグルで検索するだけで使用できることがわかりました
Platform.exit();
うまくいかないようですが、次のようなプラットフォームパラメーターで遊んでみました
Platform.setImplicitExit(false);
ここにあなたが実行できる私のテストアプリケーションがあります:
import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.geometry.Pos;
import javafx.scene.layout.VBox;
public class SOTestFX {
public static void main(String[] args) {
SOTestFX t = new SOTestFX();
t.runFxThread();
}
public void runFxThread(){
//Application.launch(args);
final JFXPanel jfxPanel = new JFXPanel();
Platform.runLater(new Runnable() {
@Override
public void run() {
System.err.println("CREATING IMAGE");
simpleFXoperations();
System.err.println("NOW CALL EXIT");
System.err.println("JAVA FX THREAD SHOULD BE EXITED NOW");
Platform.exit();
}
});
try {
Thread.sleep(3000); // just wait a bit if something should happen, let it happen..
} catch (InterruptedException e) {
e.printStackTrace();
}
//jfxPanel.removeNotify(); // return -> java.lang.NullPointerException
//Platform.exit(); // -> does nothing
System.err.println("i will never die!");
}
public void simpleFXoperations(){
VBox vbox1 = new VBox();
vbox1.setAlignment(Pos.BOTTOM_CENTER);
vbox1.setStyle("-fx-border-style: solid;"
+ "-fx-border-width: 1;"
+ "-fx-border-color: white");
System.err.println("simpleFXoperations() _DONE");
}
}
そして、これは決して閉じることのないスレッドです
「アタッチ リスナー」 - スレッド t@17 java.lang.Thread.State: RUNNABLE
ロックされた所有可能なシンクロナイザー: - なし
「JavaFX アプリケーション スレッド」 - スレッド t@13 java.lang.Thread.State: RUNNABLE at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method) at com.sun.glass.ui.gtk.GtkApplication$3 $1.run(GtkApplication.java:82) at java.lang.Thread.run(Thread.java:722)
ロックされた所有可能なシンクロナイザー: - なし
更新: Linux Fedora 16 64 ビットで最新の Oracle JDK 7u17 64 ビットを使用しています。