最近,我遇到了一个或两个Java GUI应用程序在关闭时无法关闭的问题。 它们似乎是一个过程,消耗着计算机资源。 今天,我深入探究了问题的根源,这是一个我以前从未意识到的棘手问题,所以我想我会分享一下。
理论上,当您关闭Java应用程序时,应停止所有线程,并且进程应终止。 就我而言,当我监视应用程序时,我希望完成的线程(例如Swing工作池)仍然处于活动状态,即Strange。 原因是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.updateValue(SOME_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,但是正如您将看到的,我的Thread会执行更新一秒(300ms),因此队列上始终有一个事件! 简而言之,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.html

Java GUI应用程序关闭陷阱相关推荐

  1. java 应用程序 gui_Java GUI应用程序关闭陷阱

    java 应用程序 gui 最近,我遇到了一个或两个Java GUI应用程序在关闭时无法关闭的问题. 他们似乎是一个过程,消耗着计算机资源. 今天,我深入探究了问题的根源,这是一个我以前不曾意识到的棘 ...

  2. 【Java】编写Java GUI应用程序,完成从键盘输入矩形的长和宽,求矩形的周长和面积并输出结果的功能...

    计算公式 周长=(长+宽)*2 面积=长*宽 import javax.swing.JOptionPane; public class MyTest2 {/*输入矩形的长和宽,计算矩形的周长和面积*/ ...

  3. ubuntu java 中文_Ubuntu下 JAVA GUI 程序汉字显示为方框解决办法

    在Ubuntu下运行Java GUI应用程序时发现里面的汉字都是显示为方框,同时我系统中部分应用程序打开时里面的汉字也显示为方框. 试着移除 /etc/fonts/conf.d/49-sansseri ...

  4. idea前端可视化_IntelliJ IDE 开发Java GUI 入门

    本博客主要对java 的GUI相关知识进行简单的介绍和总结,整个博客按照创建一个java GUI的顺序进行介绍,期间穿插讲解用到的java Swing的布局.控件等相关知识.本博客所进行的讲解及工程的 ...

  5. 一种有效组织Java GUI 源码的编程架构

    目录 目录 1. 引言 2. 几种不好的GUI编程架构的表现形式 2.1 三种类都放到一个篮子里 2.2 监听器类.界面类放到一个篮子里 2.3 模型类与界面组件存在耦合 2.4 设计的监听器类粒度太 ...

  6. Java GUI程序示例

    Java GUI程序示例 与命令行界面相比,图形界面对于用户来说更为简便易用.图形用户界面(Graphical User Interface,简称 GUI),关于Java图形用户界面,可参见 http ...

  7. 利用Java GUI,结合Java Socket,Java多线程,服务器,制作一个简单的具有界面的多用户实时聊天程序(从GUI,到Socket,到多线程,到服务器,项目级别详细教程)

    目录 规划 Java GUI设计 Java Socket Java 服务器 利用 IntelliJ IDEA软件为例 首先,我们应当了解,像运行在两台电脑或者手机终端这样的程序一般是没有办法直接相互发 ...

  8. java swing 退出程序_如何从cod中关闭Java Swing应用程序

    如何从cod中关闭Java Swing应用程序 从代码中终止Swing应用程序的正确方法是什么,有哪些陷阱? 我试图在计时器启动后自动关闭我的应用程序. 但是只是在JFrame上拨打dispose() ...

  9. 项目展示--基于UDP传输协议+GUI的Java聊天小程序(图片加源代码)

    前言 前几天没什么事儿,在学习UDP和TCP传输协议,顺手做了一个基于UDP协议的聊天小程序,同时复习了Java的GUI知识. 程序运行截图展示 1.运行程序,生成第一个窗口,输入要监听的端口号:12 ...

最新文章

  1. pytorch 卷积网络入门实例
  2. python最大公约数和最小公倍数
  3. Fast R-CNN论文详解 - CSDN博客
  4. Three.js入门
  5. asp.net core结合NLog搭建ELK实时日志分析平台
  6. 分享一个数据产品经理的PRD
  7. oracle 客户端连接数_转载:查看Oracle连接数
  8. “意念打字”终成真!准确率超 99%,还登上了《Nature》封面!
  9. Vue3+Cli4 中使用 Echarts 5
  10. 安装gid12.0.4linux-x64l后启动报错/liblzma.so.5: no version information available 的解决办法
  11. 国外经济学期刊分类汇总(经济学、统计学、精算学和金融计量方面)
  12. 计算机算法设计与分析
  13. 漫话:如何给女朋友解释为什么12306会用户信息泄露(上)——密码篇
  14. Jenkins--创建自己的第一个Jenkins任务
  15. c c++ 信息服务查询服务器
  16. android 锁屏壁纸和桌面壁纸的设置实现
  17. jpg图片损坏怎么修复?可以试试这个方法
  18. 【观察】戴尔科技+VMware:多云演进,步步为“赢”
  19. 蓝桥杯泊松分酒java_蓝桥杯-泊松分酒 - steven_wjg的个人空间 - OSCHINA - 中文开源技术交流社区...
  20. 高效流量变现平台——穿山甲

热门文章

  1. java泛型程序设计——翻译泛型表达式+翻译泛型方法
  2. DFS应用——找出无向图的割点
  3. azure 部署java_jClarity:在Azure上升级到Java
  4. 如何做到服务器虚拟化_尽可能地做到无服务器,但不止于此
  5. jboss eap_HawtIO在JBoss EAP上(第二部分)
  6. 使用ORM提取数据很容易! 是吗?
  7. Apache Ivy 2.5.0发布
  8. H2数据库的Spring Boot
  9. JAX-RS和OpenAPI对Hypermedia API的支持:任重而道远
  10. elastic 修改map_Amazon Elastic Map Reduce使用Apache Mahout计算建议