戴尔的网站建设目标,iis7 wordpress伪静态,食品网站策划,高端网站建设一般多少钱java 应用程序 gui最近#xff0c;我遇到了一个或两个Java GUI应用程序在关闭时无法关闭的问题。 他们似乎是一个过程#xff0c;消耗着计算机资源。 今天#xff0c;我深入探究了问题的根源#xff0c;这是一个我以前不曾意识到的棘手陷阱#xff0c;所以我想我会分享一下… java 应用程序 gui 最近我遇到了一个或两个Java GUI应用程序在关闭时无法关闭的问题。 他们似乎是一个过程消耗着计算机资源。 今天我深入探究了问题的根源这是一个我以前不曾意识到的棘手陷阱所以我想我会分享一下。 理论上当您关闭Java应用程序时应停止所有线程并且进程应终止。 就我而言当我监视应用程序时我希望完成的线程例如Swing工作池仍处于活动状态奇怪。 原来的原因是AWT Shutdown线程没有终止所有帮助程序线程其原因是EventQueues中仍然存在AWT事件。 我将解释其原因是真正的偷偷摸摸的小gatcha。 我的应用程序使用了一个具有常规睡眠的线程但是当醒来时会进行一些计算然后调用以更新gui Thread updateThread new Thread(new Runnable() {Override
public void run() {int i 0;do {try {Thread.sleep(300); // 300msgui.updateValue(SOME_VALUE)} catch(InterruptException ex) {return;} frame.setValue(SOMEDATA); } while(i 100); } }, updateThread);updateThread.setDaemon(true);
updateThread.start(); 现在您将注意到如果线程被中断并且作为守护程序线程启动则该线程返回。 我以为作为应用程序关闭的一部分线程将被终止但实际上并非如此。 这是由gui.updateValueSOME_VALUE使用InvokeLater引起的 public void updateValue(final int value) {// make sure we access graphics in the EDT threadjava.awt.EventQueue.invokeLater(new Runnable() {Override public void run() { try { ......... SOME CODE }catch(Exception t) {// not a lot to do } } });
} InvokeLater基本上是在EventQueue上放置一个事件因此AWT Shutdown线程想要关闭应用程序。 AWT Shutdown线程每秒钟检查一次EventQueues但是正如您将看到的我的线程会执行亚秒级更新300毫秒因此队列上始终有一个事件 简而言之AWT Shutdown线程永远不会终止我希望其终止的线程因此需要终止应用程序。 在我的线程的while循环中变通方法很简单我还检查了通过它进行更新的JComonent是否仍然可见并显示如果不是退出循环则该线程死亡因此没有其他事件放在事件线程上然后应用程序按预期关闭) Thread updateThread new Thread(new Runnable() {Override
public void run() {int i 0; do { try { Thread.sleep(300); // 300msgui.updateValue(SOME_VALUE); }catch(InterruptException ex) { return;} frame.setValue(SOMEDATA);}while(i 100 progressGlassPane.isVisible() progressGlassPane.isShowing());}
}, updateThread);
updateThread.setDaemon(true);
updateThread.start(); 因此简而言之不要以低于一秒的频率从帮助程序线程中调用InvokeLater除非在正在更新的组件不再可见的情况下也终止了该线程 作为旁注发现问题后我发现这非常 参考 Coal Face博客上Java桌面开发的 JCG合作伙伴 Steve Webb的Java GUI Application Shutdown Gotcha 。 翻译自: https://www.javacodegeeks.com/2012/05/java-gui-application-shutdown-gotcha.htmljava 应用程序 gui