我有一个简单的控制台应用程序,有时需要执行图形操作,对于那些我正在使用JavaFx框架(我需要一些函数,如文本的CSS样式)我只是生成一些形状和文本到一个隐藏的场景然后保存那些存档的,就是这样,
我知道要使用JavaFx我必须将图形操作传递给JavaFx线程,但是当一切都完成后我必须关闭应用程序(几个小时后),这个JavaFx线程仍然保持打开状态......我真的不会想要强制退出System.exit(),因为如果有什么东西被阻止我可能想知道/等待(我也不想将所有内容都作为JavaFx应用程序执行(因为JavaFx组件不到我主应用程序的1%)
代码非常简单,谷歌搜索我发现只使用
Platform.exit();
Run Code Online (Sandbox Code Playgroud)
这似乎不起作用,我也试过玩平台参数,如
Platform.setImplicitExit(false);
Run Code Online (Sandbox Code Playgroud)
这是我可以运行的测试应用程序:
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 …
Run Code Online (Sandbox Code Playgroud) 根据Brian Goetz的Java Concurrency in Practice,JVM无法退出,直到所有(非守护程序)线程都终止,因此无法关闭Executor可能会阻止JVM退出.
即如果存在执行程序,System.exit(0)不一定按预期工作.似乎有必要放一些
public void stop() { exec.shutdown() }
Run Code Online (Sandbox Code Playgroud)
包含Executors的所有类的方法,然后在应用程序即将终止时调用它们.这是唯一的方法,还是有某种关闭所有Executors的快捷方式?
我想关闭一个带有指定返回码的javafx应用程序.浏览SO上的答案,我发现了以下成语:
Platform.exit();
System.exit(0);
Run Code Online (Sandbox Code Playgroud)
例如:
在关闭我的JavaFX程序
或此处之前停止线程:JavaFX应用程序在关闭后仍然运行
这两个方法一个接一个地执行,看起来我们正在尝试复制某些操作.我认为,如果Platform.exit()
成功,它不应该返回到System.exit(0)
被调用的地方.但是,如果Platform.exit()
仅触发在另一个线程上运行的某些关闭操作,则返回并且System.exit(0)
可以调用,这可能会导致某些竞争条件,其中两个线程正在尝试关闭同一个应用程序.
那么,这个成语究竟是如何运作的呢?