使用ConcurrentLinkedQueue时出现以下错误:



我有非常简单的代码,我只想从多个线程向队列添加值。问题在于,类似的代码可以与类似类型的查询配合使用。

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/

10-12 05:08