2010-07-19 56 views

回答

6

如果您能帮到您,请不要致电System.exit()

退出java进程的最好方法是让所有线程正常退出。这将终止VM。

在你的主JFrame,你应该setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)

然后您可以致电frame.dispose()关闭JFrame并退出EDT。

+3

不应该是'DISPOSE_ON_EXIT'?使用'EXIT_ON_CLOSE'还会导致正在运行的线程被终止,而不允许它们正常退出(当用户关闭JFrame时)。 – 2010-07-19 19:15:44

+2

我不同意。 GC需要一段时间才能完成,应用程序退出。一旦你处理完你应该做的事情,调用System.exit没有任何问题。在调用System.exit之后,文件,套接字以及这些关闭只能自己找到。 – Mike 2010-07-20 03:02:14

5

由于虚拟机在System.exit()调用后终止,所以我认为它并不影响正在调用哪个线程。

+0

我同意。由于exit()杀死了路径中的所有内容,所以你不应该关心哪个线程调用它。 – f1sh 2010-07-19 14:17:44

1

System.exit()不终止正在运行的线程,而是终止虚拟机本身。因此可以从任何线程调用它,结果总是相同的,如果VM死亡,线程中所有可能的不可感知状态将不会立即存在。

3

你可以从任何线程调用它,但它使用它恕我直言是一种粗鲁。不管别的什么东西在运行,虚拟机都会被终止。

我更喜欢dispose()或只是关闭(有setDefaultCloseOperation(DISPOSE_ON_CLOSE))任何显示的窗口(JFrame,JDialog,...)。如果只有守护程序线程正在运行,则虚拟机将被终止。如果有一些活的非守护线程,JVM将不会终止,并且线程可以完成其工作。
这样做,我总是可以将一个程序的(部分)包含在另一个程序中,而不必担心其中一个程序是否会意外终止另一个程序。

有极少数的情况下的JVM真的需要被“封杀” ......

0

有秋千规则的EDT线程正常终止。

最重要的是要确保所有的框架已被处置。 不幸的是,如果您在没有父母的情况下使用模态对话框,这可能不那么简单,因为Swing会为这些对话框创建一个不可见的父框架。

在这种情况下,您必须列出所有框架(您可以使用Frame.getFrames()),并明确地指定dispose()

当然,你必须确保没有Thread活着(守护进程除外)。有些库甚至JDK的一些API会创建非守护线程,您必须关闭自己。

最后,最重要的是,不调用System.exit()将无法在Java Web Start环境中工作(请参阅this SO question以查找更多信息)。

所以,最后,我的建议是实际调用System.exit(),因为您并不总是知道应用程序将在哪个环境中启动。但我会添加一个重要的点:确保有一个从哪个退出执行的点。从调用它,任何线程都会好的。

1

从你想要的任何线程中调用System.exit绝对没有错。让它“正常”退出实际上并不奏效,因为当应用程序退出之前,您会发现应用程序将在GC收集内容时处于闲置状态。 我写了大量的gui Swing应用程序,调用它绝对没有错。这也不是“粗鲁”。这是Java的方式。

相关问题