gpt4 book ai didi

使用 Semaphore 运行时出现 java.util.NoSuchElementException

转载 作者:行者123 更新时间:2023-11-30 08:10:11 24 4
gpt4 key购买 nike

我有一个包含 10 个元素的队列,我启动了 100 个线程,其中 6 个可以并发运行,由信号量控制。当每个线程运行时,它获取头部元素,然后将其添加到尾部。但有时我会得到这个异常(exception):

java.util.NoSuchElementException
at java.util.LinkedList.removeFirst(LinkedList.java:270)
at java.util.LinkedList.remove(LinkedList.java:685)
at IBM.SemApp$1.run(SemApp.java:27)
at java.lang.Thread.run(Thread.java:745)
import java.util.LinkedList;    
import java.util.Queue;
import java.util.Random;
import java.util.concurrent.Semaphore;

public class SemApp {
public static void main(String[] args) {

Queue queueB = new LinkedList<>();
for (int i = 0; i < 10; i++) {
queueB.add("Object " + i);
}

Runnable limitedCall = new Runnable() {
final Random rand = new Random();
final Semaphore available = new Semaphore(6);
int count = 0;

public void run() {
int time = rand.nextInt(15);

try {
available.acquire();
String A = (String) queueB.remove();
queueB.add(A);
available.release();
count++;
System.out.println(count);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};

for (int i = 0; i < 100; i++) {
new Thread(limitedCall).start();
}
}
}

我做错了什么?

最佳答案

问题是 LinkedList 不是线程安全的结构。

因此,它不应被多个并发线程共享和修改,因为 queueB 上的更改可能无法正确“传达”给其他线程。

尝试使用 LinkedBlockingQueue相反。

此外,出于同样的原因,为 count 使用 AtomicLong:它在多个线程之间共享,并且您希望避免竞争条件。

关于使用 Semaphore 运行时出现 java.util.NoSuchElementException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31881642/

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