在另一个线程中迭代时添加到队列

时间:2019-04-19 22:31:00

标签: java

在我的游戏中,我从客户端接收输入作为事件,并将它们存储在队列中。

private Queue<Event> unprocessedEvents = new LinkedList<>();

@Override
public void onEvent(@NotNull Event event) {
    unprocessedEvents.add(event);
}

队列在服务器上的另一个线程中每秒每秒处理10次。

Iterator<Event> eventIterator = unprocessedEvents.iterator();
while (eventIterator.hasNext()) {
    Event event = eventIterator.next();

    //Handle the input from the client/server
    Event event = input(event);

    //Remove the event from the unprocessed inputs
    eventIterator.remove(); //ConcurrentModificationException
}

有时我在迭代队列时尝试插入事件时收到ConcurrentModificationException。现在我不确定最好的解决方案是对队列进行处理吗?

我应该在这里使用synchronized块吗? Collections.synchronizedList()CopyOnWriteArrayListBlockingQueue

我可以维护一个单独的队列,然后使用unprocessedEvents将新队列添加到addAll()吗?

1 个答案:

答案 0 :(得分:1)

您可能要使用ConcurrentLinkedQueue,因为它本身可以处理并发线程访问。