gpt4 book ai didi

java - 使用 ConcurrentLinkedQueue 会导致错误

转载 作者:行者123 更新时间:2023-11-30 03:07:17 26 4
gpt4 key购买 nike

使用ConcurrentLinkedQueue时出现以下错误:

Error : local variables referenced from a lambda expression must be final or effectively final

我有非常简单的代码,我只想从多个线程向队列添加值。问题是相似的代码可以很好地处理相似类型的查询。

import java.util.concurrent.ConcurrentLinkedQueue; 

ConcurrentLinkedQueue<Double> concurrentLinkedQueue = new ConcurrentLinkedQueue<Double>();
threads = new ArrayList<Thread>();
startTime = System.nanoTime();

for (int i = 0; i < numberOfThread; i++) {
Thread addingThread;
addingThread = new Thread(() -> {
for (int j = 0; j < targetNumber; j++) {
concurrentLinkedQueue.add(5.55); // error line
}
});
threads.add(addingThread);
}

threads.forEach(Thread::start);

for (Thread thread : threads) {
thread.join();
}

这里出了什么问题?我正在尝试添加 const 值,这怎么可能,它告诉我该值不是最终的?

最佳答案

因为在方法内部声明的变量被放在堆栈上(它们仅在方法的持续时间内存在),而不是在堆上,所以您无法从该方法内部声明的本地匿名内部类内部访问它们(例如作为您的线程),除非您将这些实例声明为 final

因此,您需要将声明 concurrentLinkedQueue 的行更改为

final ConcurrentLinkedQueue<Double> concurrentLinkedQueue = new ConcurrentLinkedQueue<Double>();

这可以确保您创建的线程可以访问队列,即使创建线程的方法在线程完成之前退出。

我看不到您声明 targetNumber 的位置,但您需要确保它是在方法外部定义的,或者也标记为 final >。我猜因为这不是造成麻烦的行,它是在其他地方定义的。

关于java - 使用 ConcurrentLinkedQueue 会导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34432848/

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