关于线程的中处理集合一些问题. 100分赏金来了 线程java 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 报错的原因是addAll方法中在迭代carIdAndTimeSet, 而线程1中又往carIdAndTimeSet里加数据.这样改下:carIAndTime.addAll(new HashSet<String>(dfw.getCarIdAndTimeSet())); 没看到你map的定义,不过看提示你用的是HashMap,HashMap是非线程安全的,多线程最好用HashTable,你可以换一下再试试看报错不 我晕,我没法回复上面的楼层还有编辑自己的帖子也不行private Map<String, Long> map = new ConcurrentHashMap<String,Long>(); private Map<String, Long> map = new ConcurrentHashMap<String,Long>(); private Map<String, Long> map = new ConcurrentHashMap<String,Long>();你没试试1楼的吗? private Map<String, Long> map = new ConcurrentHashMap<String,Long>();你没试试1楼的吗?暂时没试。系统还在正常的跑着。稍后再试试 不行跑了8个小时也挂了不好意思, 我的方法其实跟你之前没有本质区别,还是一样的错误。 但是错误如我所说,不能再迭代的过程中往里放数据。你可以使用ConcurrentHashMap, 用这个Map实现Set的功能。 ConcurrentHashMap 可以边迭代边加数据。不然的话只能加锁了,手动对Set中数据的进出进行同步。 public boolean isExist(Map<String, Long> map, String abc){ return map.get(abc) != null; } 如果你只有这两个线程的话,应该没问题。不过看你线程2中定义的变量是 public ,是不是有其他线程也访问了。 看你 贴出来的异常信息是 hashMap的 迭代器失效错误,但是你说380行是 carIAndTime.addAll(new HashSet<String>(dfw.getCarIdAndTimeSet()));却又是 hashset,怪哉 HashSet 内部就是一个HashMap java.util.ConcurrentModificationException 这个异常多发生在对集合进行迭代的时候意思是说:迭代器在进行迭代的时候不允许外面对它进行修改,说的很拗口,举个例子就是List<String> list = new ArrayList<String>(); list.add("aaa"); list.add("bbb"); list.add("ccc"); Iterator<String> iterator = list.iterator();//迭代的时候 while(iterator.hasNext()){ String s = iterator.next(); list.remove(s);//外部修改是不行的 //iterator.remove();//内部修改时可以的 } System.out.println(list.size());那么LZ报错的那个地方carIAndTime.addAll(dfw.getCarIdAndTimeSet());/看看AbstractCollection的源码就知道了public boolean addAll(Collection<? extends E> c) { boolean modified = false; Iterator<? extends E> e = c.iterator(); while (e.hasNext()) { if (add(e.next())) modified = true; } return modified; }addAll方法也用到了迭代器,这个方法的入参来自你第一个线程,在迭代的时候即addAll的那一刻,被线程1给改了,就会抛出java.util.ConcurrentModificationException而且你这是生产者消费者模式,不能用set,要用queue,即是是多次读,也要用queue包装一下 下载的jar包放在哪里? 简单的时钟 求 :员工信息管理 ~系统,要求用array 储存员工数据,不用数据库! 正则表达式,两个连接,为什么不能正确匹配第一个连接和文字? java 怎样调用传真的功能 一个很简单的输入输出问题,但~~ 开始动手研究布局管理,呵呵,大家进来看看,给点我意见。谢谢! 大家好,给点建设性意见。。。。。。 学习core java中的疑惑(关于super的使用) 求实用的java小程序,最好有源码!!! 几个关于网络通信、编程的疑问,真正懂网络的请进 jquery如何获取springmvc传来的数据集合
还有编辑自己的帖子也不行private Map<String, Long> map = new ConcurrentHashMap<String,Long>();
暂时没试。系统还在正常的跑着。稍后再试试
不行跑了8个小时也挂了
不好意思, 我的方法其实跟你之前没有本质区别,还是一样的错误。 但是错误如我所说,不能再迭代的过程中往里放数据。你可以使用ConcurrentHashMap, 用这个Map实现Set的功能。 ConcurrentHashMap 可以边迭代边加数据。不然的话只能加锁了,手动对Set中数据的进出进行同步。
return map.get(abc) != null;
}
不过看你线程2中定义的变量是 public ,是不是有其他线程也访问了。
意思是说:迭代器在进行迭代的时候不允许外面对它进行修改,说的很拗口,举个例子就是
List<String> list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
Iterator<String> iterator = list.iterator();//迭代的时候
while(iterator.hasNext()){
String s = iterator.next();
list.remove(s);//外部修改是不行的
//iterator.remove();//内部修改时可以的
}
System.out.println(list.size());那么LZ报错的那个地方
carIAndTime.addAll(dfw.getCarIdAndTimeSet());/
看看AbstractCollection的源码就知道了public boolean addAll(Collection<? extends E> c) {
boolean modified = false;
Iterator<? extends E> e = c.iterator();
while (e.hasNext()) {
if (add(e.next()))
modified = true;
}
return modified;
}addAll方法也用到了迭代器,这个方法的入参来自你第一个线程,在迭代的时候即addAll的那一刻,被线程1给改了,就会抛出
java.util.ConcurrentModificationException
而且你这是生产者消费者模式,不能用set,要用queue,即是是多次读,也要用queue包装一下