使用ConcurrentLinkedQueue会导致错误

时间:2015-12-23 09:52:31

标签: java multithreading lambda syntax-error

使用ConcurrentLinkedQueue时出现以下错误:

  

错误:从lambda表达式引用的局部变量必须是最终的或有效的最终

我有非常简单的代码,我只想从多个线程向队列添加值。问题是类似的代码可以在类似的查询类型中正常工作。

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值,这怎么可能,它告诉我关于价值不是最终的?

1 个答案:

答案 0 :(得分:2)

因为在方法中声明的变量放在堆栈上(它们只在方法的持续时间内存在),而不是在堆上,所以你不能从在该方法中声明的本地匿名内部类中访问它们(例如你的主题),除非你将这些实例声明为final

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

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

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

我无法看到您宣布targetNumber的位置,但您需要确保它在方法之外定义,或者它是“ s也标记为final。我猜是因为它不是导致麻烦的因素,而是在其他地方定义的。