2015-12-23 2 views
1

Я получаю следующее сообщение об ошибке при использовании ConcurrentLinkedQueue:Использование 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, как это возможно, что он говорит мне о том, что значение не является окончательным?

ответ

2

Поскольку переменные, объявленные внутри метода, помещаются в стек (они живут только в течение всего метода), а не в куче, вы не можете получить к ним доступ из внутренних локальных анонимных внутренних классов, объявленных внутри этого метода (например, ваш поток), если вы не объявите эти экземпляры как final.

Так что вам нужно изменить строку, где вы объявить concurrentLinkedQueue к

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

Это гарантирует, что очередь доступна нить, которую вы создали, даже если способ, в котором поток создается выходы, прежде чем нить заканчивается.

Я не вижу, где вы заявили targetNumber, но вам нужно убедиться, что он либо определен вне метода, либо также отмечен как final. Я предполагаю, что это не та строка, которая вызывает проблемы, она определена в другом месте.

+0

Вы правы о 'targetNumber' - это не окончательно, и оно меняется. В любом случае окончание очереди заканчивается с ошибкой. – Rocketq

Смежные вопросы