Java GUI应用程序关闭陷阱

最近,我遇到了一个或两个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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373044.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

shell启动程序脚本

#!/bin/bash#/usr/local/xxx/bin/xxxx.sh start#/usr/local/xxx/bin/startup.shfor i in find /server -name start.sh do fadirdirname $i //读取父目录 cd $fadir echo > nohup.out ./start.sh & sleep 2 echo "start succe…

Unity性能优化的N种武器

贴图&#xff1a; l 控制贴图大小&#xff0c;尽量不要超过 1024 x1024&#xff1b; l 尽量使用2的n次幂大小的贴图&#xff0c;否则GfxDriver里会有2份贴图&#xff1b; l 尽量使用压缩格式减小贴图大小&#xff1b; l 若干种贴图合并技术&#xff1b; l 去除多余的alpha…

cmd控制屏幕光标_电脑控制手机?上班时间愉快尽情地玩手机吧!它值得您拥有!...

在现今时代&#xff0c;手机已成为人们必不可少的工具&#xff0c;有的时候甚至可以说手机比电脑方便好用多了&#xff0c;例如某些实用的APP软件就只有手机端并没有电脑端&#xff0c;想使用的话就得整天捧着手机盯着不放。但别忘记&#xff0c;我们大多数都是打工族&#xff…

xp系统设置锁定计算机,系统锁定时不关机的诀窍 给XP系统关闭计算机再加一把锁...

很多用户抱怨在使用电脑的过程中&#xff0c;总是经常会被琐碎的事情打断&#xff0c;有时候难免暂时离开电脑&#xff0c;处于便利和资料安全&#xff0c;我们往往会按下“WindowsL”来锁定计算机。这样&#xff0c;操作方便同时又能阻止他人乱动我们的计算机。但是如果遇到好…

ACM题目————中位数

题目描述 长为L的升序序列S&#xff0c;S[L / 2]为其中位数。 给出两个等长升序序列S1和S2&#xff0c;求两序列合并并排序后的中位数。 输入 多组数据&#xff0c;每组第一行为n&#xff0c;表示两个等长升序序列的长度。 接下来n行为升序序列S1的元素&#xff0c;再接下来n行…

Regular Exprassion--正则表达式基础

正则表达式&#xff1a; 强大灵活的文本处理工具 语法&#xff1a; 普通字符 转义字符 \ , \t , \n , \\ 标准字符集合&#xff08;大写代表相反的意思&#xff09; \d 任意一个数字 \w 任意一个字母、数字、下划线 \s 空白符&#xff…

使用ReportNG更好看的TestNG HTML测试报告– Maven指南

当“扩展TestCase”是编写测试中必不可少的一部分时&#xff0c; TestNG是作为JUnit 3的注释驱动替代创建的测试框架。 即使现在&#xff0c;它也提供了一些有趣的功能&#xff0c;例如数据提供程序&#xff0c;并行测试或测试组。 在我们的测试不是从IDE执行的情况下&#xff…

gitee项目404问题_七款开源项目,让你数据库管理不再成为一个问题

在开发过程中&#xff0c;数据库是必不可少的一环&#xff0c;但大多数情况下开发者们还是在用命令行来管理数据库。虽然在外人看起来输入一行行代码非常的酷炫&#xff0c;但其中的繁琐可能也只有开发者知道。七款开源项目&#xff0c;让你数据库管理不再成为一个问题今天 Git…

vb 窗体html表格,VB.Net – 高级表格

在本章中&#xff0c;让我们研究以下概念 :在应用程序中添加菜单和子菜单在表单中添加剪切&#xff0c;复制和粘贴功能锚定和对接控件表格模态表格添加菜单和子菜单应用程序中的菜单传统上&#xff0c;菜单&#xff0c;MainMenu&#xff0c;ContextMenu和MenuItem类用于在Windo…

SpringMVC后台接收list类型的数据的实现方式

一、背景 最近在做一些东西的时候&#xff0c;遇到一个需要Springmvc后台接收list类型数据的需求&#xff0c;几经辗转才完美解决了这个问题&#xff0c;今天记下来方便以后使用&#xff0c;也分享给需要的小伙伴们~ 二、实现方式 实现方式一 前端页面 1 <% page language&q…

Maven集成测试和Spring Restful Services

介绍 我的原始博客通过一个非常简单的示例展示了如何分离Maven单元和集成测试。 http://johndobie.blogspot.com/2011/06/seperating-maven-unit-integration-tests.html此后&#xff0c;许多人要求我提供比最初使用的示例更实际的示例。 这篇文章展示了如何在实际环境中&#…

玩cf出现outofmemory_CF画质粗糙平衡感人,却能历经十年经久不衰,靠的是什么?...

Hello大家好&#xff0c;我是沐辰。《穿越火线》这款游戏国内运营时间已长达十年&#xff0c;从最早接触这款游戏开始&#xff0c;很多玩家都在这里烙刻下了许多关于青春的回忆。CF的许多问题一直颇受诟病&#xff0c;例如落后且粗糙的画质、英雄级武器与平民武器的巨大差距、千…

jquery遍历ajax返回的json数据

我们以前在前端遍历ajax拿到的数据一般都是用for或其他方式遍历&#xff0c;这样做麻烦且费事&#xff0c;效率不高&#xff0c;下面提供一个函数&#xff0c;只需调用函数即可把数据遍历出来&#xff0c;方便高效。 html代码&#xff1a; <html> <head><script…

Apache JMeter:随心所欲进行负载测试

这是有关使用Apache JMeter进行负载测试的第二篇文章&#xff0c;请在此处阅读第一篇文章&#xff1a; 有关对关系数据库进行负载测试的分步教程。 JMeter有很多采样器 。 如果您需要JMeter不提供的采样器&#xff0c;则可以编写自定义采样器。 &#xff08;自定义采样器在JMet…

html5历史管理

在网易云课堂上看了妙味课堂的关于html5历史管理的课程&#xff0c;在这里做一下笔记。 单页面或ajax局部刷新的页面中&#xff0c;没有办法通过前一步和后一步得到历史访问数据&#xff0c;此时有两种方法可以解决这个问题&#xff1a; 1.onhashchange事件&#xff0c;示例代码…

elementui下拉框 清空_巧妙解决element-ui下拉框选项过多的问题

1. 场景描述不知道你有没有这样的经历&#xff0c;下拉框的选项很多&#xff0c;上万个选项甚至更多&#xff0c;这个时候如果全部把数据放到下拉框中渲染出来&#xff0c;浏览器会卡死&#xff0c;体验会特别不好用人会说element-ui的select有一个remote-method&#xff0c;支…

致敬词

见义勇为致敬词 面对灾难和死神&#xff0c;你们大义凛然、知险而上&#xff0c;把平安和生机留给他人&#xff0c;把困难和危险留给自己。巍巍乎高山景行&#xff0c;铮铮然铁骨侠风&#xff1b;壮志谱传奇&#xff0c;热血写春秋。你们是&#xff1a;百姓英雄&#xff0c;平安…

MOXy作为您的JAX-RS JSON提供程序–客户端

最近&#xff0c;我发布了如何利用EclipseLink JAXB&#xff08;MOXy&#xff09;的JSON绑定来创建RESTful服务。 在本文中&#xff0c;我将演示在客户端利用MOXy的JSON绑定有多么容易。 MOXy作为您的JAX-RS JSON提供程序–服务器端 MOXy作为您的JAX-RS JSON提供程序–客户端 …

经常使用计算机的孩子,常玩电脑对孩子负面影响大,家长们不容小觑!

相信不少的家庭都会备有电脑&#xff0c;人们在网络世界里面能够找到自己需要的东西。不仅是大人喜欢玩电脑&#xff0c;小孩也喜欢玩电脑。然而常玩电脑对孩子负面影响大吗&#xff1f;有多大&#xff1f;一、行为问题全国青少年教育协会指出&#xff0c;5岁以下的使用电脑的孩…

基于SpringBoot的养老院管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SpringBoot的养老院管理系统,java项…