`
icarusliu
  • 浏览: 238090 次
  • 性别: 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的方法是否是线程安全的呢?

 

 

分享到:
评论

相关推荐

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

    SwingWorker 是 Java 中的一个类,用于在背景线程中执行长时间的操作。使用 SwingWorker,可以将查找操作移入一个新的线程中,并且可以在 EDT 中执行 GUI 操作。 例如,在执行查找操作时,可以使用 SwingWorker 来...

    使用SwingWorker异步加载JTree

    SwingWorker是一个抽象类,它允许我们在后台执行计算,并在计算完成后更新UI。它的主要方法包括`doInBackground()`,在这个方法中执行耗时任务;`process()`,用于处理`doInBackground()`产生的中间结果;以及`done...

    另外一个java多线程下载程序源代码

    在Java编程语言中,多线程是实现并发执行...总的来说,这个开源项目为我们提供了一个学习Java多线程下载的实践案例,通过对源代码的分析和研究,我们可以深入理解Java多线程编程,以及如何在实际应用中解决并发问题。

    java编写的简单的记事本小程序

    在这个小程序中,开发者可能已经实现了读取、写入和编辑文本的基本操作,这对于初学者来说是一个很好的实践项目,有助于理解和掌握文件I/O操作、文本处理以及用户界面设计等核心概念。 首先,Java的文件I/O操作是...

    使用java的gui做一个登录 注册 条件查询的小作业

    在本项目中,我们将利用Java的图形用户界面(GUI)技术来实现一个包含登录、注册和条件查询功能的小型应用程序。这个程序可以帮助我们理解和实践如何将用户交互与后端数据处理相结合,为用户提供友好的界面。 首先...

    一个简易的JAVA数字时钟支持24时12时转换

    在Java编程语言中,开发一个数字时钟程序可以是一个很好的实践项目,特别是在学习面向对象编程和时间处理概念时。这个项目名为"一个简易的JAVA数字时钟支持24时12时转换",它提供了在12小时制和24小时制之间切换的...

    java做的简单的进度条

    本教程将深入讲解如何在Java中实现一个简单的进度条,这对初学者来说是一个很好的实践项目。 首先,我们需要了解Java Swing库,它是Java的标准图形用户界面(GUI)工具包。进度条在Swing中由JProgressBar类表示。...

    Java实现的一个简单文本编辑器

    6. **多线程**:为了确保用户体验,文本编辑器可能需要在一个单独的线程(如`SwingWorker`)中执行耗时的操作,如读取大文件或执行复杂的搜索。 7. **国际化与本地化**:如果希望编辑器支持多种语言,可以使用`...

    JAVA情人节主题爱心代码.zip

    在Java编程世界中,开发一个情人节主题的爱心代码是一个有趣且富有创意的实践。这个"JAVA情人节主题爱心代码.zip"压缩包包含两个关键文件:一个PDF文档“java项目本地环境搭建手册.pdf”以及一个文本文件“JAVA情人...

    swing实现的猫版聊天室

    首先,使用JFileChooser对话框让用户选择要发送的文件,然后通过Swing的多线程处理(如SwingWorker)来避免阻塞UI,最后通过网络编程(如Socket编程)将文件传输到服务器或另一个客户端。在传输过程中,可能还需要...

    一个十分经典的java冒泡排序,界面实现.rar

    冒泡排序是一种基础且直观的排序...总的来说,这个项目提供了一个很好的实践机会,帮助开发者将理论知识应用于实际编程,并通过可视化的方式加深对冒泡排序的理解。无论是初学者还是经验丰富的开发者,都能从中受益。

    java图形用户界面实例

    动画图标是增强用户体验的一个重要元素。在Java中,我们可以通过Swing Timer或者JavaFX的Timeline来实现动态效果,例如旋转、缩放、平移等。这样的动画可以使界面更具吸引力,同时也可以提供更直观的反馈。 文件...

    java图像处理编程技术与实践

    本主题聚焦于"java图像处理编程技术与实践",是面向已经掌握Java基础,尤其是Swing框架的开发者们的一份高等教材。下面将详细探讨这一领域的关键知识点。 首先,Java中的图像处理主要依赖于`java.awt`和`javax....

    java swing界面开发的一个抓取快递接口工具

    Java Swing是Java标准库中的一个组件,...总的来说,这个项目涉及到Java GUI编程、网络请求、JSON解析、错误处理和用户交互等多个方面,对于想要学习Java Swing和API接口集成的开发者来说,这是一个很好的实践案例。

    一个简单的Java通讯录程序

    Java通讯录程序是一个基础的桌面应用程序,主要利用Java语言和Swing库来构建用户界面,实现联系人信息的增删查改功能,是初学者了解Java编程和GUI设计的绝佳实践项目。下面我们将深入探讨这个程序涉及到的核心知识点...

    基于Java实现利用GUI界面布局实现一个小的打字得分游戏.zip

    在本项目中,我们主要探讨的是如何利用Java编程语言,结合图形用户界面(GUI)来设计和实现一个简单的打字得分游戏。这是一个典型的Java课程设计项目,旨在帮助学习者掌握Java GUI编程的基本概念和技巧。 首先,...

    基于java的一个简单的即时通讯工具的设计与开发(源代码+LW).zip

    在本项目中,“基于java的一个简单的即时通讯工具的设计与开发(源代码+LW)”是一个实践性的教程,旨在教你如何利用Java编程语言构建一个基本的即时通讯应用。这个项目不仅提供了理论知识,还包含了实际的源代码,...

    Java弹球项目代码实现

    Swing是Java的一个图形用户界面(GUI)工具包,它提供了丰富的组件和功能,用于构建桌面应用程序。 在Java中,Swing库提供了一套组件,如JFrame、JButton、JLabel等,用于创建窗口、按钮和标签等元素。在这个弹球...

    Java Swing例题

    Java Swing是Java编程语言中的一个图形用户界面(GUI)工具包,它是Java Foundation Classes (JFC)的一部分。在Java Swing中,你可以创建丰富的、跨平台的桌面应用程序。本篇讨论的主题是"Java Swing例题",我们将深入...

    用Swing写的一个RPG游戏

    总之,这款《用Swing写的一个RPG游戏》展示了Swing在桌面游戏开发中的应用,涉及了界面设计、用户交互、事件处理等多个方面,是学习和实践Java GUI编程的好例子。通过研究其源码,开发者不仅可以提升Swing技能,还能...

Global site tag (gtag.js) - Google Analytics