相关疑难解决方法(0)

Java:如何在迭代/添加元素时从列表中删除元素

这个问题是在描述(和解决)问题的一个比较特殊的情况下这个问题.

我有两个方法,stopAndRemove(ServerObject服务器)和close()方法.后者应关闭所有服务器并将其从服务器列表中删除.该列表定义为

List<ServerObject> server. 
Run Code Online (Sandbox Code Playgroud)

我不想在closeCurrentlyOpen中使用stopAndRemove中的几乎相同的代码,所以我想做类似的事情:

public void closeCurrentlyOpen() {
   for(ServerObject server : this.servers) {
       stopAndRemove(server)
   }
}
Run Code Online (Sandbox Code Playgroud)

这将不起作用,因为这将导致ConcurrentModificationException.我试着复制一份清单

List<ServerObject> copyList = new ArrayList<ServerObject>(this.servers);
Run Code Online (Sandbox Code Playgroud)

并将其用作foreach循环的列表.但是当我在copyList上迭代时,另一个线程可能会将服务器附加到服务器列表,但closeCurrentlyOpen应该会产生一个emtpy列表.当addServerToList方法同步到servers-list时,执行此操作

public void closeCurrentlyOpen() {
   synchronized(this.servers) {
     for(ServerObject server : this.servers) {
        stopAndRemove(server)
     }
    }
}
Run Code Online (Sandbox Code Playgroud)

将通过修改解决问题.但是我不能在stopAndRemove方法中同步代码,如果直接调用它是必需的.

在我看来,这三种方法的设计可能需要修改.任何人的想法?

java algorithm collections list

18
推荐指数
2
解决办法
6万
查看次数

标签 统计

algorithm ×1

collections ×1

java ×1

list ×1