//我要完成的功能如下面代码所示,请教,此功能该如何实现
Iterator it = list.iterator();
while(true){while(it.hasNext()){
  Object obj = it.next();//当我进行遍历的时候,另一程序对list添加数据,这句话就报错了,报错信息如下
  //TODO 这里处理obj
  it.remove();
}sleep(20)
}报错信息
Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException
        at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
        at java.util.AbstractList$Itr.next(AbstractList.java:343)
        at desktopapplication2.collection.server.SaveData.run(SaveData.java:32)
        at desktopapplication2.collection.util.SocketSwitch.start(SocketSwitch.java:65)
        at desktopapplication2.DesktopApplication2View.jButton1ActionPerformed(DesktopApplication2View.java:619)
        at desktopapplication2.DesktopApplication2View.access$400(DesktopApplication2View.java:26)
        at desktopapplication2.DesktopApplication2View$4.actionPerformed(DesktopApplication2View.java:377)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
        at java.awt.Component.processMouseEvent(Component.java:6134)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
        at java.awt.Component.processEvent(Component.java:5899)
        at java.awt.Container.processEvent(Container.java:2023)
        at java.awt.Component.dispatchEventImpl(Component.java:4501)
        at java.awt.Container.dispatchEventImpl(Container.java:2081)
        at java.awt.Component.dispatchEvent(Component.java:4331)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4301)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3965)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3895)
        at java.awt.Container.dispatchEventImpl(Container.java:2067)
        at java.awt.Window.dispatchEventImpl(Window.java:2458)
        at java.awt.Component.dispatchEvent(Component.java:4331)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

解决方案 »

  1.   

    1 使用 CopyOnWriteArrayList 
    2 lock
      

  2.   

    把你list类型都换成CopyOnWriteArrayList
      

  3.   


    List list = new CopyOnWriteArrayList();
    for(Iterator iter = list.iterator(); iter.hasNext();) {
        Object obj = iter.next();
        ...
        if(***) {
            list.remove(obj);
        }
    }
      

  4.   

    同步问题,可以在这个方法上增加synchronized关键词
      

  5.   

    List list = new CopyOnWriteArrayList();
    for(Iterator iter = list.iterator(); iter.hasNext();) {
        Object obj = iter.next();
        ...
        if(***) {
            list.remove(obj);
            //it.remove();这个 remove和上面的这个是同样的效果吗?    }
    }
      

  6.   

    CopyOnWriteArrayList  还真没用过
    最多也就用用linkedlist
      

  7.   

    根据你的意思理解如下,添加和删除都是一个线程完成的import java.util.List;
    public class AddListThread implements Runnable {
    private List<String> list = null;
    public AddListThread(List<String> list){
    this.list = list;
    }
    public void run() {
    int i = 0;
    while(true){
    list.add("String"+i++);
    }
    }
    }
    import java.util.Iterator;
    import java.util.List;
    public class CopyOnWriteArrayListThread implements Runnable {
    private List list = null;

    public CopyOnWriteArrayListThread(List list){
    this.list = list;

    }
    public void run() {
    Iterator iter = list.iterator();
    while(true){
    while(iter.hasNext()){
    String str = (String)iter.next();
    System.out.println("-------->" + Thread.currentThread().getName() + "  " + str);
    list.remove(str);
    try {
    Thread.sleep(200);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    }
    }
    }
    import java.util.List;
    import java.util.concurrent.CopyOnWriteArrayList;public class CopyOnWriteArrayListTest { public static void main(String[] args) {
    List<String> list = new CopyOnWriteArrayList();
    new Thread(new AddListThread(list)).start();
    new Thread(new CopyOnWriteArrayListThread(list)).start();
    }
    }
    结果如下:-------->Thread-1  String0
    -------->Thread-1  String1
    -------->Thread-1  String2
    -------->Thread-1  String3
    -------->Thread-1  String4
    -------->Thread-1  String5
    -------->Thread-1  String6
    -------->Thread-1  String7
    -------->Thread-1  String8
    -------->Thread-1  String9
    -------->Thread-1  String10
    -------->Thread-1  String11
    -------->Thread-1  String12
    -------->Thread-1  String13
    -------->Thread-1  String14
    -------->Thread-1  String15
      

  8.   

    有没有办法使CopyOnWriteArrayListThread  这个线程一直运行下去, 就算出异常停止运行了也让它自动重新开始运行?