gpt4 book ai didi

java - 即使在检查后也出现 NoSuchElementException

转载 作者:行者123 更新时间:2023-12-02 09:07:14 27 4
gpt4 key购买 nike

for (final ArrayList<SmartPhone> smartPhones : smartPhonesCluster) {
new Thread(new Runnable() {
@Override
public void run() {
for (SmartPhone smartPhone : smartPhones) {
Queue<SmartPhoneTask> tasks = smartPhone.getSystem()
.getTaskQue();
SmartPhoneTask task = null;
assert tasks != null;
try {
while (!tasks.isEmpty()) {
task = tasks.poll(); // This is the line throwing the exception (GlobalNetwork.java:118)
assert task != null;
task.execute();
task.onTaskComplete();
}
} catch (RuntimeException e) {
e.printStackTrace();
}
}
}
}).start();
}

并记录:

java.util.NoSuchElementException
at java.util.LinkedList.remove(LinkedList.java:788)
at java.util.LinkedList.removeFirst(LinkedList.java:134)
at java.util.LinkedList.poll(LinkedList.java:470)
at com.wtsang02.reu.botnet.network.GlobalNetwork$1.run(GlobalNetwork.java:118)
at java.lang.Thread.run(Thread.java:662)
java.lang.NullPointerException
Exception in thread "Thread-299" java.lang.AssertionError
at com.wtsang02.reu.botnet.network.GlobalNetwork$1.run(GlobalNetwork.java:119)
at java.lang.Thread.run(Thread.java:662)

第 118 行指向:

task=tasks.poll();

如何解决这个问题?队列是 LinkedList 实现(如果有区别的话)。

最佳答案

LinkedList 不是线程安全的,因此如果您在多个线程上访问 Linkedlist,则需要外部同步。此同步是在某个对象上进行的(synchronized 方法只是“在 this 上同步”的简写),并且获取和放置都必须在上同步相同的对象。您肯定会在这里执行此操作,因为您为每个 SmartPhone 创建一个新线程,然后从那里访问该手机的 LinkedList

如果一个线程在 someObject1 上同步时将其放入列表中,然后另一个线程在 someObject2 上同步时读取该列表,那么这不会 算作外部同步——代码仍然有问题。

即使您使用了线程安全集合,如果多个线程同时清空队列,也可能会遇到此异常。例如,想象一下:

thread A: put e into queue1
thread B: queue1.isEmpty()? No, so go on
thread C: queue1.isEmpty()? No, so go on
thread B: queue1.poll() // works
thread C: queue1.poll() // NoSuchElementException

您应该使用BlockingQueue,如果列表中没有更多元素,其poll()方法将返回null。继续拉,直到得到 null,然后中断循环。

关于java - 即使在检查后也出现 NoSuchElementException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17705658/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com