我有这段代码:
public static final ReentrantLock lock = new ReentrantLock();
public static void sendMessage(final ArrayList<String> JIDs, final String text) {
synchronized (MainActivity.getContext()) {
if (JIDs != null) {
lock.lock();
try {
Runnable r = new Runnable() {
public void run() {
if (Looper.myLooper() == null) {Looper.prepare();}
for (String JID : JIDs) {
if (JID != null) {
Intent sendIntent = new Intent();
sendIntent.setAction("message.platform.SEND_MESSAGE");
sendIntent.putExtra("jid", JID);
sendIntent.putExtra("content", text);
MainActivity.getContext().sendBroadcast(sendIntent);
}
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
Thread t = new Thread(r);
t.start();
try {t.join();} catch (InterruptedException e) {e.printStackTrace();}
} finally {
lock.unlock();
}
}
}
}
它应该做的是迭代不同JID的列表并向每个JID发送相同的消息,每个消息之间有300ms的延迟。此过程必须同步并锁定,因为我不希望多个线程同时访问此代码。它还在执行此代码时在另一个线程上运行,因为需要300ms的延迟(不想在UI上执行此操作)。
但是,在成功运行此代码多个小时后,此错误总是出错:
java.util.ConcurrentModificationException
at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:573)
然后在我的方法中指出这段代码:
>>> for (String JID : JIDs) {
就我而言,我不会以任何形式或形式修改此列表......发生了什么?为什么它会工作几个小时,然后随机吐出这个错误?提前谢谢!
修改
我这样称呼方法:
sendMessage(new ArrayList<String>(Arrays.asList("jid1","jid2")),"Hello everyone!");