`

多线程处理问题

 
阅读更多
在项目开发中,遇到这样一个问题:
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中多线程处理与多媒体应用的核心技术,具体目标包括: 1. **理解线程概念**:线程是操作系统能够进行运算调度的最小...

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

    【多线程处理大数据叠加的问题】在处理大数据时,单线程的方式往往效率低下,因为CPU的计算能力没有得到充分利用。多线程技术可以解决这个问题,通过将大任务拆分成多个小任务,由多个线程并行处理,从而提高整体...

    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