使用 ConcurrentLinkedQueue 导致错误
Using ConcurrentLinkedQueue causes error
我在使用 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
。我猜是因为引起麻烦的不是那一行,它是在别处定义的。
我在使用 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
。我猜是因为引起麻烦的不是那一行,它是在别处定义的。