对一集合进行添加和删除操作

风影枫林 2011-09-21 01:27:49

//我要完成的功能如下面代码所示,请教,此功能该如何实现
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)



...全文
169 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
风影枫林 2011-09-22
  • 打赏
  • 举报
回复
13楼问题有人能回答吗?
cfapple111 2011-09-21
  • 打赏
  • 举报
回复
學習了。。。。
风影枫林 2011-09-21
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 wokeke 的回复:]
根据你的意思理解如下,添加和删除都是一个线程完成的

Java code


import java.util.List;
public class AddListThread implements Runnable {
private List<String> list = null;
public AddListThread(List<String> list)……
[/Quote]


有没有办法使CopyOnWriteArrayListThread 这个线程一直运行下去, 就算出异常停止运行了也让它自动重新开始运行?
wokeke 2011-09-21
  • 打赏
  • 举报
回复
根据你的意思理解如下,添加和删除都是一个线程完成的

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
JustDoIt_NotLast 2011-09-21
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 whlusha720 的回复:]

CopyOnWriteArrayList 还真没用过
最多也就用用linkedlist
[/Quote]
同感
whlusha720 2011-09-21
  • 打赏
  • 举报
回复
CopyOnWriteArrayList 还真没用过
最多也就用用linkedlist
风影枫林 2011-09-21
  • 打赏
  • 举报
回复


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

}
}

黎某人 2011-09-21
  • 打赏
  • 举报
回复
同步问题,可以在这个方法上增加synchronized关键词
wokeke 2011-09-21
  • 打赏
  • 举报
回复

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


softroad 2011-09-21
  • 打赏
  • 举报
回复
把你list类型都换成CopyOnWriteArrayList
风影枫林 2011-09-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 huntor 的回复:]
1 使用 CopyOnWriteArrayList
2 lock
[/Quote]

能给个简单的代码示例吗?
风影枫林 2011-09-21
  • 打赏
  • 举报
回复
第一次就挂了
softroad 2011-09-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 huntor 的回复:]

1 使用 CopyOnWriteArrayList
2 lock
[/Quote]

CopyOnWriteArrayList 学习了。
chenchenyangll 2011-09-21
  • 打赏
  • 举报
回复
第一次循环可以成功 第二次就挂了吧?
huntor 2011-09-21
  • 打赏
  • 举报
回复
1 使用 CopyOnWriteArrayList
2 lock

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧