关于线程的中处理集合一些问题

问题描述

整个生产数据的和处理数据的过程都需要快速。希望大侠们帮忙看看,帮小弟指出有什么需要优化的地方和容易出问题的地方//线程1---生产数据publicclassDataForWlanextendsThread{privateCardReaderForWlanrr;publicstaticSet<String>carIdAndTimeSet=Collections.synchronizedSet(newHashSet<String>());publicSet<String>getCarIdAndTimeSet(){returncarIdAndTimeSet;}publicvoidsetCarIdAndTimeSet(Set<String>carIdAndTimeSet){this.carIdAndTimeSet=carIdAndTimeSet;}//初始化线程类privatevoidinit(){try{rr=newCardReaderForWlan();//创建无线读卡连接}catch(ReaderExceptione){e.printStackTrace();return;}if(rr==null){return;}}publicsynchronizedvoidrun(){init();try{while(true){TagReadData[]trd=rr.MultiReadCard();//不断的读卡但不一定每时每刻都有数据产生if(trd.length>0){readCar(trd);}//this.sleep(5);}}catch(Exceptione){this.stop();e.printStackTrace();}}/***处理需要的数据*/publicvoidreadCar(TagReadData[]trd){try{inttrdLength=trd.length;if(trdLength<=0){return;}for(inti=0;i<trdLength;i++){StringcardID=trd[i].EPCHexstr();//卡IDStringcarIdAndTime=cardID+","+System.currentTimeMillis()/1000;//用于线程2处理数据用carIdAndTimeSet.add(carIdAndTime);//短时间内会读一张卡几次,但只需要一结果即可}}catch(Exceptione){e.printStackTrace();}}/***清空数据*/publicvoidclearcarIdAndTimeSet(){carIdAndTimeSet.clear();}}

线程2publicclassMainJFrameextendsjavax.swing.JFrameimplementsActionListener,Runnable{publicSet<String>carIAndTime=null;//读到的卡号存放publicSet<String>cardIdlist=newHashSet<String>();//显示面板存放卡号privateMap<String,Long>map=newConcurrentHashMap<String,Long>();publicDataForWlandfw=newDataForWlan();//无线读卡器线程publicvoidrun(){while(true){try{carIAndTime=newHashSet<String>();carIAndTime.addAll(dfw.getCarIdAndTimeSet());//将线程1中的值赋值给carIAndTimedfw.clearcarIdAndTimeSet();//清空数据if(carIAndTime.size()!=0){Iterator<String>iterator=carIAndTime.iterator();while(iterator.hasNext()){StringcardTime=iterator.next();String[]strs=cardTime.split("[,]");StringcardID=strs[0];//卡IDuser=listAllUsers.get(strs[0]);//根据卡ID得到签到人员if(user!=null){longtime=Long.valueOf(strs[1]);Iterator<String>keys=map.keySet().iterator();if(keys.hasNext()){//以下是做业务处理可以忽略booleanre=isExist(map,cardID);if(re){//存在longaftertime=map.get(cardID);//前一个时间if(time-aftertime>30){map.put(strs[0],Long.valueOf(strs[1]));cardIdlist.add(strs[0]);}}else{map.put(strs[0],Long.valueOf(strs[1]));cardIdlist.add(strs[0]);}}else{map.put(strs[0],Long.valueOf(strs[1]));cardIdlist.add(strs[0]);}setCarIdOfTime(cardIdlist);//将得到数据,进行业务处理cardIdlist.clear();iterator.remove();//后来加的}}}Thread.currentThread().sleep(600);}catch(InterruptedExceptione){e.printStackTrace();}}}publicbooleanisExist(Map<String,Long>map,Stringabc){booleanisexit=false;Iterator<String>keys=map.keySet().iterator();if(keys.hasNext()){while(keys.hasNext()){Stringkey=(String)keys.next();if(abc.equals(key)){//判断此卡号在map中不存在returntrue;}}}returnisexit;}}

运行几个小时后报错如下。有的时候几十分钟也会报这个错误这个错误也是我最常看到的,经常出现。Exceptioninthread"Thread-4"java.util.ConcurrentModificationExceptionatjava.util.HashMap$HashIterator.nextEntry(UnknownSource)atjava.util.HashMap$KeyIterator.next(UnknownSource)atjava.util.AbstractCollection.addAll(UnknownSource)atindexframes.MainJFrame.run(MainJFrame.java:380)atjava.lang.Thread.run(UnknownSource)//380行就是线程2中的carIAndTime.addAll(dfw.getCarIdAndTimeSet());

但是在线程2中添加下面代码后已经跑了12个小时。还在测试中iterator.remove();//后来加的

感觉这边remove还是有风险

解决方案

时间: 2024-10-28 07:22:26

关于线程的中处理集合一些问题的相关文章

关于线程的中处理集合一些问题. 100分赏金来了

问题描述 整个生产数据的和处理数据的过程都需要快速.希望大侠们帮忙看看,帮小弟指出有什么需要优化的地方和容易出问题的地方//线程1---生产数据publicclassDataForWlanextendsThread{privateCardReaderForWlanrr;publicstaticSet<String>carIdAndTimeSet=Collections.synchronizedSet(newHashSet<String>());publicSet<String

改善C#程序的建议6:在线程同步中使用信号量

原文:改善C#程序的建议6:在线程同步中使用信号量 所谓线程同步,就是多个线程之间在某个对象上执行等待(也可理解为锁定该对象),直到该对象被解除锁定.C#中对象的类型分为引用类型和值类型.CLR在这两种类型上的等待是不一样的.我们可以简单的理解为在CLR中,值类型是不能被锁定的,也即:不能在一个值类型对象上执行等待.而在引用类型上的等待机制,则分为两类:锁定和信号同步. 锁定,使用关键字lock和类型Monitor.两者没有实质区别,前者其实是后者的语法糖.这是最常用的同步技术: 本建议我们讨论

Guava中针对集合的 filter和过滤功能

Guava中针对集合的 filter和过滤功能 博客分类:  JAVA相关  在guava库中,自带了过滤器(filter)的功能,可以用来对collection 进行过滤,先看例子:     Java代码   @Test   public void whenFilterWithIterables_thenFiltered() {       List<String> names = Lists.newArrayList("John", "Jane", 

两个线程同时操作一个集合,一个线程读,一个线程写。有可能会产生并发问题吗?

问题描述 两个线程同时操作一个集合,一个线程读,一个线程写.有可能会产生并发问题吗? 我下面的代码为啥没有并发问题? 请哪位大神指导下 class Program { public Thread Threadone; public Thread Threadtwo; public event EventHandler EventRun; public static object obj=new object(); ArrayList ListArry = new ArrayList(); pri

Java线程编程中的主线程讲解_java

当Java程序启动时,一个线程立刻运行,该线程通常叫做程序的主线程(main thread),因为它是程序开始时就执行的.主线程的重要性体现在两方面: 它是产生其他子线程的线程: 通常它必须最后完成执行,因为它执行各种关闭动作. 尽管主线程在程序启动时自动创建,但它可以由一个Thread对象控制.为此,你必须调用方法currentThread()获得它的一个引用,currentThread()是Thread类的公有的静态成员.它的通常形式如下: static Thread currentThre

程序猿的日常——Java中的集合列表

列表对于日常开发来说实在是太常见了,以至于很多开发者习惯性的用到数组,就来一个ArrayList,根本不做过多的思考.其实列表里面还是有很多玩法的,有时候玩不好,搞出来bug还得定位半天.所以这里就再啰嗦一下,整理下相关的内容. 基础知识 一般计算机相关的专业都应该学过数据结构,而很多的集合都是应用了经典的数据结构设计的.比如数组.栈.队列.链表.树等等,里面也会用到很多常见的查找或者排序算法,所以就先简单的回顾下. 数组 数组在c语言里面用的很广泛,刚开始学习的时候,整天的空指针和数组越界.后

同步-线程并发中wait()和notify()怎么用的,可不可以举个小例子

问题描述 线程并发中wait()和notify()怎么用的,可不可以举个小例子 线程并发中wait()和notify()怎么用的,可不可以举个小例子,再问一下,线程中阻塞方法有哪些,同步的有哪些? 解决方案 参考:http://longdick.iteye.com/blog/453615

线程-mfc中定义大量宏的问题

问题描述 mfc中定义大量宏的问题 我定义了大量的宏,在cmainframe和一个共有类(用于存放一些静态函数和变量,主要是为了线程函数中使用全局变量)中里面的一个函数中需要使用到,我直接把它们放在一个头文件中然后include,就报了error LNK2005: ""struct Zeni_MTS_Rolypon_InOut InOutRoly"" (?InOutRoly@@3UZeni_MTS_Rolypon_InOut@@A) already defined

executor-关于线程池中get()的疑问

问题描述 关于线程池中get()的疑问 如果我的文件夹下共有五个空文件,2个txt文档,那么会产生6个线程,但是为什么在下面代码中count只出现了5次?每个线程都会运行到这段代码的啊. for (Future<Integer> futureItem : results) { count += futureItem.get(); System.out.println("count出现了一次"); } 运行结果如下: 代码如下: public class ThreadPool