当我尝试将消息写入文件时,java.util.ConcurrentModificationException
我是一名Java开发新手。我想用GUI编写电子邮件客户端,但在尝试运行当我尝试将消息写入文件时,java.util.ConcurrentModificationException,java,Java,我是一名Java开发新手。我想用GUI编写电子邮件客户端,但在尝试运行WriteMessagesthread时遇到问题。我正在使用JavaMail库 public class WriteMessages implements Runnable { private List<Message> list; private Properties properties; private Utilities util = new Utilities(); p
WriteMessages
thread时遇到问题。我正在使用JavaMail库
public class WriteMessages implements Runnable {
private List<Message> list;
private Properties properties;
private Utilities util = new Utilities();
public WriteMessages(List<Message> list, Properties properties) {
this.list = list;
this.properties = properties;
}
@Override
public void run() {
Iterator<Message> iter = list.iterator();
while (iter.hasNext()) {
Message m = iter.next(); //line 42 exception occurs there
String name = Morda.produceFileName(m);
File file = new File(properties.getProperty("PathToMessages") + "//" + name);
try {
file.createNewFile();
} catch (IOException ex) {
}
try (OutputStream os = new FileOutputStream(file);){
m.writeTo(os);
System.out.println("File " + file.getName() + " was wrote succesfuly");
} catch (IOException | MessagingException ex) {
}
}
}
}
但是,当我删除这段代码时:
try (OutputStream os = new FileOutputStream(file);){
m.writeTo(os);
System.out.println("File " + file.getName() + " was wrote succesfuly");
} catch (IOException | MessagingException ex) {
}
异常没有出现。我想这个问题已经解决了,但我不知道怎么解决。请帮我解决这个问题。
谢谢。我怀疑另一个线程正在访问列表,而该线程正在迭代列表中的消息。这是因为列表引用是共享的,并在其构造函数中传递给线程 每当列表对象在此线程或其他线程中使用时,请尝试对其进行同步。您可以使用同步列表:
List<Message> messageList = Collections.synchronizedList(list);
你应该能够通过同步这个线程产生的方法的访问来解决这个问题。
< P>我认为这可能是因为你用其他线程中的消息修改列表,而因为ARARYLIST不是线程安全的,你应该考虑另一个列表实现。对于线程安全的实现,可以在并发环境中读取更多的,考虑使用简单的<代码> ARARYLIST//C>。当您开始迭代它时,您将迭代迭代开始时列表的内容。通常这是人们想要的行为。使用
Collections.synchronizedList
实际上无助于防止ConcurrentModificationException
,可能会降低应用程序的响应速度。谢谢您的回答,但这没有任何效果。谢谢。它帮助我解决了这个问题。谢谢,问题解决了。谢谢大家的帮助。我使用@TagirValeev的建议,简单地将ArrayList
替换为CopyOnWriteArrayList
,一切正常。
List<Message> messageList = Collections.synchronizedList(list);
synchronized(messageList) {
Iterator<Message> iter = messageList.iterator();
while (iter.hasNext()) {
...
}
}