即使某个函数当前正在运行,我也希望强行关闭一个Java窗口 - 有没有办法做到这一点?我有一些功能在某些条件下需要一段时间(例如,从CD或其他非本地位置运行),我希望能够强制停止这些功能并完全退出程序。这可能吗?我该怎么做呢?
我退出的代码如下:
public function boot()
{
Article::updated(function ($user) {
// do some stuff here
});
}
closeApplication()函数:
this.addWindowListener(new java.awt.event.WindowAdapter() {
@Override
public void windowClosing(java.awt.event.WindowEvent windowEvent) {
if (closeApplication()) {
System.exit(0);
}
}
});
快速编辑以澄清:当我的程序执行长时间运行的函数并且我尝试关闭窗口时,窗口监听器甚至没有注册点击。
答案 0 :(得分:3)
您面临的问题显而易见:您的应用程序正在被冻结"在长时间运行的后台任务中,因为它在事件派发线程上执行。使用SwingWorker。这样,当您的长时间运行任务在后台线程上运行时,您的GUI将保持响应。您可以使用System.exit()
进行终止,但最安全的方法是等待长时间运行的任务完成。
答案 1 :(得分:1)
您似乎正在事件派发线程中执行长时间运行的操作。这是GUI用于触发所有事件的线程。因此,如果您阻止此线程,则会阻止您的GUI。 JFrame
的关闭操作是这些操作之一。这就是为什么在GUI线程中执行长时间运行时不会触发它的原因。
要解决此问题,您应该考虑长时间运行的操作。无论如何,你应该把它移到后台线程:
是否执行可以随时取消的操作,没有发生错误?在这种情况下,您可以将操作放在守护程序线程中。这告诉JVM,该线程可以随时终止。它不应该保持JVM活着。这方面的一个示例是从Web API请求信息的操作。
else 如果在任何时候终止长时间运行的操作时发生了不好的事情,那么您应该将操作放在非守护程序线程中。在这种情况下,使用System.exit
关闭应用程序也是一个坏主意,因为这也会杀死非守护程序线程。您需要实现一种机制,它可以优雅地终止后台线程,或者等待它完成。这有时可能很困难,但这是必要的。此类长时间运行操作的一个示例是写入文件:如果您只是终止此操作,则该文件将被破坏。
另见What is Daemon thread in Java?
如果您想对长期运行的操作使用ExecutorService
,那么您可能会对方法ExecutorService::shutdown
感兴趣:
启动有序关闭,其中执行先前提交的任务,但不接受任何新任务。