【发布时间】:2015-10-12 15:34:35
【问题描述】:
我想从列表中删除一个对象,但我有一个线程一直在使用迭代器检查同一个列表。我已经有了要删除的对象,是否必须使用另一个迭代器来遍历列表,同时检查对象,然后使用迭代器将其删除,还是有更简单的方法?现在,如果我尝试使用 remove 方法从列表中删除对象,线程上的迭代器会给我一个NoSuchElementException。
//Threaded loop.
Iterator<Client> playersIterator = getPlayers().iterator();
while(playersIterator.hasNext()){
Client c = playersIterator.next(); //NoSuchElementException
if(c.getSocket().isClosed()) {
playersIterator.remove();
if(getHost() == c) {
assignNewHost();
}
getServer().getLobbyHandler().updateGames();
}
}
//Use an iterator to remove?
public void removePlayerFromGame(Client client) {
Game g = getServer().getGame(client);
if(g != null) {
g.getPlayers().remove(client);
}
}
【问题讨论】:
-
我认为最好使用
synchronized块,这样您就可以控制对集合的访问,因此基本上,removePlayerFromGame将等待迭代器完成后再删除,或者否则,迭代器将在删除之前等待删除完成。照原样,您无法控制何时会发生什么。
标签: java multithreading java.util.concurrent