`

多线程处理问题

 
阅读更多
在项目开发中,遇到这样一个问题:
UI中有个prepare按钮,负责准备数据。
当UI中选择多个table,进行prepare数据的时候,会有个成员变量List<TableData>负责存储结果数据。
在prepare按钮的addListener中,会启动一个线程去prepare数据。

正常流程:
preparing(){
List<TableData> tabledatas=new ArrayList<>();
for()
{
   table= prepareOneTable() ;
   tabledatas.add(table);
}
}


现在的问题就是当点击prepare按钮后,一个线程开始处理多个表,处理到其中一个表的时候,耗时很长,这时候,我们点击了cancle,然后取消一些table,再点击了一次prepare 就出现了问题。
虽然在preparing方法中,每次都new了一个新的arraylist,但是,前一个线程完成那个耗时的任务的时候,调用tabledatas.add(table);方法,因为tabledatas是个成员变量,全局的,所以还是会加进去table,这样数据就出现了异常。

解决方案,在Listener中new Thread的时候,用一个成员变量threadHashCode记录下这个thread的hashCode。
在preparing方法中,用个局部变量flagcode=threadHashCode;
每次添加table的时候,判断flagcode==threadHashCode,即可。

prepareThread = new Thread(){
					public void run()
					{
						preparing();//preparing();get the table data
					}
				};
				threadHashCode=prepareThread.hashCode();
				System.out.println("threadHashCode"+threadHashCode);
				prepareThread.start();

private boolean preparing()
	{
		if(saveflag)// when saving test case data is success
		{
			tableDatas = new ArrayList<TableData>();
			dtlist = ((SpTestCase)testCase).getDataTransformers();
			tableDatasList = new ArrayList<List<TableData>>();
			int flagHashCode=threadHashCode;
			for(DataTransformer dtt:dtlist){
				if(dtt!=null){
					List<TableData> tDatas = new ArrayList<TableData>();
					tDatas = dtt.exportData();
					System.out.println("tDatas"+tDatas.size());
					System.out.println("flagHashCode"+flagHashCode);
					if(threadHashCode==flagHashCode){
						tableDatasList.add(tDatas);
						tableDatas.addAll(tDatas);
					}
					else {
						return false ;
					}
				}
			}
			System.out.println("tableDatas:"+tableDatas.size());
			testCase.settableCount(tableDatas.size());
			testCase.setTableDatas(tableDatas);
			return true;
		}
		else {
			Log.warn("not prepared!Something is valid! maybe null data");
			return false;
		}

	}



因为好像没找到很好停止java线程的方法。。。
回去看看这个http://www.cnblogs.com/gpcuster/archive/2010/01/18/1650273.html

分享到:
评论

相关推荐

    相机采集、处理、显示多线程处理框架

    相机采集、处理、显示多线程处理是指使用多个线程来同时执行相机数据采集、处理和显示的操作。其中采集线程负责从相机中获取图像数据,处理线程负责对采集到的图像数据进行处理和算法分析,显示线程负责将处理后的...

    java多线程处理数据库数据

    在Java编程中,多线程处理是提升程序性能和效率的重要手段,特别是在处理大量数据库数据时。本主题将深入探讨如何使用Java的并发包(java.util.concurrent)来实现多线程对数据库数据的批量处理,包括增、删、改等...

    winform 多线程处理数据

    本篇将详细讨论如何在WinForm应用中运用多线程处理数据以及异步更新UI。 1. **什么是多线程?** 在计算机科学中,多线程是指在一个进程中同时执行多个不同的代码段,每个代码段称为一个线程。通过多线程,程序可以...

    java多线程处理大数据

    java多线程处理大数据,可根据配置的线程数,任务去调度处理

    多线程的处理

    线程安全是多线程编程中的一个重要问题。当多个线程同时访问和修改同一数据时,如果没有正确处理,可能会导致数据不一致。为确保线程安全,开发者需要采用各种策略,如避免使用全局变量、使用线程局部存储、使用原子...

    多线程处理大数据叠加的问题

    在多线程处理大数据的上下文中,叠加问题指的是如何高效地将多个线程中的计算结果合并成最终结果。本文将通过Java编程语言的示例代码,探讨如何实现多线程相加的场景,并分析多线程在大数据处理中的优势及潜在问题。...

    java多媒体与多线程处理实验

    ### Java多媒体与多线程处理实验知识点概览 #### 一、实验目标解析 本次实验旨在深入探索Java中多线程处理与多媒体应用的核心技术,具体目标包括: 1. **理解线程概念**:线程是操作系统能够进行运算调度的最小...

    windows 多线程处理

    在Windows编程中,多线程处理是一项至关重要的技术,它能显著提升程序的性能和响应速度,尤其是在处理并发任务和优化资源利用时。本章主要介绍了六个关键知识点,旨在帮助学习者深入理解并掌握多线程处理。 1. **...

    多线程分块处理图像

    在IT领域,尤其是在计算机视觉和图像处理中,多线程技术常常被用来优化性能,特别是在处理高分辨率图像时。本文将深入探讨“多线程分块处理图像”这一主题,结合OpenCV库来阐述如何利用多线程技术提高图像处理效率。...

    多线程处理数据(工具)样例

    这个名为“多线程处理数据(工具)样例”的项目,显然旨在利用多线程的优势来加速数据流的处理。下面将详细探讨相关知识点。 多线程是操作系统提供的一种机制,允许一个程序同时执行多个任务或子任务。在单核处理器...

    分批取数 多线程数据处理

    分批取数 多线程数据处理

    Qt 之多线程处理多任务

    在Qt框架中,多线程处理多任务是提高应用程序性能和响应能力的重要手段。Qt提供了丰富的多线程支持,使得开发者能够充分利用现代计算机的多核处理器资源,避免UI线程因执行耗时操作而导致的界面假死问题。本文将深入...

    libevent多线程处理

    本文将深入探讨如何在多线程环境中使用Libevent进行事件处理,并分享一个基于Libevent的多线程实现案例。 首先,理解Libevent的核心机制至关重要。Libevent提供了一个事件基础结构,它能够将来自不同来源的事件(如...

    c#多线程处理文档

    总的来说,正确地运用C#的多线程技术能够提升程序的性能和用户体验,但同时也需要谨慎处理线程安全和同步问题,以确保程序的稳定性和正确性。在这个未完成的项目中,开发者可能正在探索如何结合C#的多线程特性与文档...

    多线程处理数据

    在IT行业中,多线程处理数据是一项至关重要的技术,尤其在大数据处理、实时计算和并发性能优化等场景中。本文将深入探讨多线程的概念、原理以及如何在Java中实现多线程,同时结合提供的"TestThread.java"文件,解析...

    java多线程实现大批量数据导入源码

    此外,需要注意的是,多线程环境下可能存在竞态条件、死锁等问题,需要合理使用`synchronized`关键字或`Lock`接口来保证数据的一致性和安全性。另外,适当的错误处理和日志记录也是必不可少的,以确保程序的健壮性。...

    多线程处理事件

    多线程处理事件,投递事件,子线程处理完成后,交给主线程结果;

    qt-opencv-multithreaded-1.21Qt结合OpenCV多线程图像处理

    每个线程处理一个摄像机,从中拿出帧显示到主线程的Label控件上 模拟了一个16个摄像机的场景,有不开多线程和打开多线程的对比。 可以明显感觉到打开多线程后主界面不卡了。 只是个多线程的小例子,还有很多不足之处...

    多线程并发处理的简单实现

    在编程领域,多线程并发处理是一种常见的优化技术,它能充分利用多核处理器的资源,提高程序的执行效率。在给定的标题“多线程并发处理的简单实现”中,我们可以深入探讨如何构建这样的系统。 首先,多线程并发处理...

    多线程处理工具(高效、万能的复用)

    在IT领域,多线程处理是一项关键的技术,它允许程序同时执行多个任务,极大地提高了计算机系统的资源利用率和程序运行效率。特别是在大数据读写操作中,多线程的优势尤为明显,可以显著减少整体处理时间,提高系统...

Global site tag (gtag.js) - Google Analytics