解决方案 »

  1.   

    报错的原因是addAll方法中在迭代carIdAndTimeSet, 而线程1中又往carIdAndTimeSet里加数据.这样改下:carIAndTime.addAll(new HashSet<String>(dfw.getCarIdAndTimeSet()));
      

  2.   

    没看到你map的定义,不过看提示你用的是HashMap,HashMap是非线程安全的,多线程最好用HashTable,你可以换一下再试试看报错不
      

  3.   

    我晕,我没法回复上面的楼层
    还有编辑自己的帖子也不行private Map<String, Long> map = new ConcurrentHashMap<String,Long>();
      

  4.   

    private Map<String, Long> map = new ConcurrentHashMap<String,Long>();
      

  5.   

    private Map<String, Long> map = new ConcurrentHashMap<String,Long>();你没试试1楼的吗?
      

  6.   

    private Map<String, Long> map = new ConcurrentHashMap<String,Long>();你没试试1楼的吗?
    暂时没试。系统还在正常的跑着。稍后再试试
      

  7.   


    不行跑了8个小时也挂了
    不好意思, 我的方法其实跟你之前没有本质区别,还是一样的错误。 但是错误如我所说,不能再迭代的过程中往里放数据。你可以使用ConcurrentHashMap, 用这个Map实现Set的功能。 ConcurrentHashMap 可以边迭代边加数据。不然的话只能加锁了,手动对Set中数据的进出进行同步。
      

  8.   

     public boolean isExist(Map<String, Long> map, String abc){
           return map.get(abc) != null;
        }
      

  9.   

    如果你只有这两个线程的话,应该没问题。
    不过看你线程2中定义的变量是 public ,是不是有其他线程也访问了。
      

  10.   

    看你 贴出来的异常信息是 hashMap的 迭代器失效错误,但是你说380行是 carIAndTime.addAll(new HashSet<String>(dfw.getCarIdAndTimeSet()));却又是 hashset,怪哉
      

  11.   

    HashSet 内部就是一个HashMap
      

  12.   

    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包装一下