`
icarusliu
  • 浏览: 232165 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SwingWorker的一个实践

阅读更多

部门刚成立,开发的产品也才刚刚进入迭代四,还有很多工具不够完善。

前几天定位一个问题,测试人员发送过来大量的日志,打开一看发现其中大部分都是无关的打印,于是很痛苦的使用各种关键字去搜寻自己想要的东西;更加悲剧的是,当想回过头看看刚查找到的日志时,又只能使用搜索的上一个来跳转。问题虽然弄清楚了,但人也看晕了。于是想自己弄个日志查看的东西。回家大致写出来了,但有个问题却怎么也调不好。

 

在读取模块中,先要对读取的文件的每一行进行处理,判断它是否符合当前的筛选条件,然后再将它按照日志的等级,在一个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的方法是否是线程安全的呢?

 

 

分享到:
评论

相关推荐

    Swingworker

    swing swingworker wingworker wingworker

    Swing线程的深入理解和SwingWorker基础知识介绍[参照].pdf

    Swing线程的深入理解和SwingWorker基础知识介绍[参照].pdf

    Swing线程的深入理解和SwingWorker基础知识介绍

    Swing线程的深入理解和SwingWorker基础知识介绍

    SWT与SwingWorker的结合

    Swt一般情况不允许在另外一个线程中更新控件内容,此程序使用java swing的SwingWorker对swt的控件进行操作更新。对于喜欢使用SwingWorker更新Swing控件的人来说,也可以使用SwingWorker更新Swt控件

    swingworker排序

    作业:完善swingworker排序功能

    使用SwingWorker异步加载JTree

    NULL 博文链接:https://vearn.iteye.com/blog/344591

    Java的Swing编程中使用SwingWorker线程模式及顶层容器

    主要介绍了在Java的Swing编程中使用SwingWorker线程模式及顶层容器的方法,适用于客户端图形化界面软件的开发,需要的朋友可以参考下

    An Alternative to SwingWorker.java-开源

    SwingWorker的替代品,用于在Swing中执行异步任务。 我们将SwingWorker.java与Action接口合并,生成AbstractAsynchronousAction.java。 此类的具体扩展可以用来代替任何Action。

    Swing线程的最后讨论 -- 利用异步模型

    第一篇文章《线程与Swing》,解释了Swing的单线程规则。这篇文章现在可以在The Swing Connection Archive找到。 第二篇文章《使用Swing Worker线程》,演示了如何使用SwingWorker线程工具类。它也可以在存档中找到。...

    swing-worker-troubleshooting:回购以解决SwingWorker的问题

    在这里,我们有一个简单的Swing应用程序,现在需要添加一个耗时的任务,并且需要在运行时更新进度条。 当前解决方案完全在EDT上运行( AnalysisService类中100%打包),因此阻止进度条被更新/重新绘制。 我试图...

    ProcessBar 2种经典实现

    NULL 博文链接:https://chenhailong.iteye.com/blog/1312202

    swing-worker-1.1.jar

    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....

    互联网程序设计实验六.doc

    "课程名称:互联网程序设计 "年级: "实验日期: " "姓名: "学号: "班级: " "实验名称:实验六 TCP文件传输/端 "教师评语(成绩): " "口扫描器(2学时) " " 一、实验目的及要求 (1)理解掌握SwingWorker类的...

    java动态按钮

    运用javax.swingworker类生成DynamicJButton示例

    Swing MVC 观察者 电子相册

    Swing MVC 观察者 系统托盘 SwingWorker 电子相册

    swing不确定进度条

    不确定某个程序运行多久,用进度条来监测,如果进度条监测到运行结果结束了,就退出进度条,否则以一种不确定的状态等待。

    开发J2EE应用的要领

    第一篇文章《线程与Swing》,解释了Swing的单线程规则。这篇文章现在可以在TheSwingConnectionArchive找到。第二篇文章《使用SwingWorker线程》,演示了如何使用SwingWorker线程工具类。它也可以在存档中找到。本文...

    Swing线程的最后讨论--利用异步模型

    第一篇文章《线程与Swing》,解释了Swing的单线程规则。这篇文章现在可以在TheSwingConnectionArchive找到。第二篇文章《使用SwingWorker线程》,演示了如何使用SwingWorker线程工具类。它也可以在存档中找到。本文...

    ChatWorld 聊天室

    最近由于课程需要做的用Swing做的一个聊天室软件,主要使用Java Socket进行通信,还有用到SwingWorker做多线程和XML进行数据存储。 做的比较粗糙,我附上源码了,不足的地方请大家指出来,共同进步

    线程超时死掉

    Future模式可以这样来描述:我有一个任务,提交给了Future,Future替我完成这个任务。期间我自己可以去做任何想做的事情。一段时 间之后,我就便可以从Future那儿取出结果。就相当于下了一张订货单,一段时间后可以...

Global site tag (gtag.js) - Google Analytics