java – 停止所有Awt / Swing线程和监视器和东西,以便只剩下主线
我有以下内容
public static void main(String[] args) { boolean running = true; boolean foo= false; while(running) { doSomeTask(); // might set foo true if(foo) { //This call waits/blocks until gui is done working. fireUpSwingGui(); //does work... foo=false; godModeReleaseGUIandALLResourcesOnlyWantMainThreadLeft(); } } } 希望godModeReleaseGUIandALLResourcesOnlyWantMainThreadLeft()说明一切. 请记住,当foo在doSomeTask()内部再次变为真时,我们可能会在稍后阶段再次启动gui. 解决方法
看看
AWT Threading Issues,它解释了退出AWT应用程序的标准.您要关注的部分如下:
一个快速示例应用程序来演示…… import java.awt.Frame; import javax.swing.JOptionPane; import javax.swing.SwingUtilities; public class CloseAWT { private static boolean running = true; private static int response = -1; public static void main(String[] args) { boolean showSwing = true; boolean checkFrames = true; while (running) { if (showSwing) { SwingUtilities.invokeLater(new Runnable() { public void run() { response = JOptionPane.showConfirmDialog(null,"Hello World?"); } }); showSwing = false; } else { if (response >= 0 && checkFrames) { SwingUtilities.invokeLater(new Runnable() { public void run() { // topFrame.dispose(); Frame[] frames = Frame.getFrames(); System.out.printf("frames.length=%dn",frames.length); } }); checkFrames = false; } } } } } 为了确认行为符合预期,我在JProfiler中运行了这个.单击“是”以关闭确认对话框后,’AWT-EventQueue-0’线程被标记为已死.在此之后唯一活着的线程是’main’和侦听Ctrl-Break的线程. 我强烈建议使用像JProfiler,YourKit,JProbe或其中一个免费的分析器,以确保您已正确释放所有组件并删除所有听众. 最后一个想法……您可能想要考虑将GUI作为一个单独的进程生成,并使用某种IPC在您的守护进程和GUI之间传递信息.虽然这会产生额外进程和IPC的额外开销,但它可以让您更好地确保在不再需要GUI时完全清理它. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |