部门刚成立,开发的产品也才刚刚进入迭代四,还有很多工具不够完善。
前几天定位一个问题,测试人员发送过来大量的日志,打开一看发现其中大部分都是无关的打印,于是很痛苦的使用各种关键字去搜寻自己想要的东西;更加悲剧的是,当想回过头看看刚查找到的日志时,又只能使用搜索的上一个来跳转。问题虽然弄清楚了,但人也看晕了。于是想自己弄个日志查看的东西。回家大致写出来了,但有个问题却怎么也调不好。
在读取模块中,先要对读取的文件的每一行进行处理,判断它是否符合当前的筛选条件,然后再将它按照日志的等级,在一个JTextPane中进行显示。
一开始就想到了使用SwingWorker来实现,然后就采取了以下的方法:
protected Void doInBackground() throws Exception {
BufferedReader reader = null;
reader = new BufferedReader(new FileReader(file));
String line = "";
while ((line = reader.readLine()) != null) {
if (!cache.isSatisfy(line)) {
continue;
}
publish(line);
}
reader.close();
return null;
}
protected void process(List<String> list) {
for (String line : list) {
if (line.trim().equals("")) {
continue;
}
char ch = line.charAt(16);// 日志的等级第一个字母
switch (ch) {
case 'D': {
textPane.debug(line);
break;
}
case 'I': {
textPane.info(line);
break;
}
case 'E': {
textPane.error(line);
break;
}
default: {
textPane.warn(line);
break;
}
}
}
}
即在doInBackground方法中读取文件,然后判断其是否满足条件,将满足条件的publish到process中,再显示到textPane中去。
当然同时还有一个进度条;原本以为这样就可以了:进度条在不断的转动,表明读取过程在继续;后台数据不断的在处理;
但实际上,运行的时候却发现进度条最开始还动一下,读到后来界面却死了。
测了一下,发现是由于读文件、判断条件是否满足速度很快,但将数据加到TextPane中去的速度却稍微慢些——但实际上也不慢,这导致了写到界面上去的速度很快,从而使得界面出现假死的现象。如果数据读取的速度慢些,速度条应该是可以正常工作的。于是在doInBackground中每处理一条数据后休眠了一下,进度条正常了,但处理时间却大大增加,经过调整,在5ms休眠1ms的时候能够达到使进度条不卡的情况下的最快速度。后来又尝试了两个线程:一个读取文件,一个写界面,状况依旧。
由于在process中执行的事件仍旧是在事件处理进程中执行的,因此它占用的资源太多,界面就会无法响应了,这就是根源。
那么到底有没有比较好的方法进行解决呢??
今天又再次进行了尝试,还是采用两个线程,一个读取一个写,在读之前将TextPane在界面上隐藏,然后在写线程的doInBackground方法中向其中添加内容,在完成工作后再进行显示。这样处理之后,速度比之前要快了很多,而且进度条也能正常工作了。
但这样做是否合理? Swing中说如果在非事件处理线程中对界面进行操作,有可能会导致同步问题,但有些如JTextField的SetText方法又是安全的,那么JTextPane的方法是否是线程安全的呢?
分享到:
相关推荐
swing swingworker wingworker wingworker
Swing线程的深入理解和SwingWorker基础知识介绍[参照].pdf
Swing线程的深入理解和SwingWorker基础知识介绍
Swt一般情况不允许在另外一个线程中更新控件内容,此程序使用java swing的SwingWorker对swt的控件进行操作更新。对于喜欢使用SwingWorker更新Swing控件的人来说,也可以使用SwingWorker更新Swt控件
作业:完善swingworker排序功能
NULL 博文链接:https://vearn.iteye.com/blog/344591
主要介绍了在Java的Swing编程中使用SwingWorker线程模式及顶层容器的方法,适用于客户端图形化界面软件的开发,需要的朋友可以参考下
SwingWorker的替代品,用于在Swing中执行异步任务。 我们将SwingWorker.java与Action接口合并,生成AbstractAsynchronousAction.java。 此类的具体扩展可以用来代替任何Action。
第一篇文章《线程与Swing》,解释了Swing的单线程规则。这篇文章现在可以在The Swing Connection Archive找到。 第二篇文章《使用Swing Worker线程》,演示了如何使用SwingWorker线程工具类。它也可以在存档中找到。...
在这里,我们有一个简单的Swing应用程序,现在需要添加一个耗时的任务,并且需要在运行时更新进度条。 当前解决方案完全在EDT上运行( AnalysisService类中100%打包),因此阻止进度条被更新/重新绘制。 我试图...
NULL 博文链接:https://chenhailong.iteye.com/blog/1312202
Exceptionin thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: org/jdesktop/swingworker/SwingWorker at com.android.draw9patch.Application$1.run(Application.java:48) at java.awt.event....
"课程名称:互联网程序设计 "年级: "实验日期: " "姓名: "学号: "班级: " "实验名称:实验六 TCP文件传输/端 "教师评语(成绩): " "口扫描器(2学时) " " 一、实验目的及要求 (1)理解掌握SwingWorker类的...
运用javax.swingworker类生成DynamicJButton示例
Swing MVC 观察者 系统托盘 SwingWorker 电子相册
不确定某个程序运行多久,用进度条来监测,如果进度条监测到运行结果结束了,就退出进度条,否则以一种不确定的状态等待。
第一篇文章《线程与Swing》,解释了Swing的单线程规则。这篇文章现在可以在TheSwingConnectionArchive找到。第二篇文章《使用SwingWorker线程》,演示了如何使用SwingWorker线程工具类。它也可以在存档中找到。本文...
第一篇文章《线程与Swing》,解释了Swing的单线程规则。这篇文章现在可以在TheSwingConnectionArchive找到。第二篇文章《使用SwingWorker线程》,演示了如何使用SwingWorker线程工具类。它也可以在存档中找到。本文...
最近由于课程需要做的用Swing做的一个聊天室软件,主要使用Java Socket进行通信,还有用到SwingWorker做多线程和XML进行数据存储。 做的比较粗糙,我附上源码了,不足的地方请大家指出来,共同进步
Future模式可以这样来描述:我有一个任务,提交给了Future,Future替我完成这个任务。期间我自己可以去做任何想做的事情。一段时 间之后,我就便可以从Future那儿取出结果。就相当于下了一张订货单,一段时间后可以...