У меня есть два потока, которым необходимо получить доступ к переменной экземпляра ArrayList<short[]>
.Как остановить столкновение двух потоков при доступе к java ArrayList?
Один поток будет асинхронно добавить short[]
элементы в список с помощью обратного вызова, когда новые данные прибыли: void dataChanged(short[] theData)
Другой поток будет периодически проверять, если в списке есть элементы и если он делает это будет перебирать все элементы, обрабатывать их и удалять из массива.
Как я могу настроить это для защиты от столкновений между двумя потоками?
Это надуманный пример кода в настоящее время бросает java.util.ConcurrentModificationException
//instance vairbales
private ArrayList<short[]> list = new ArrayList<short[]>();
//asynchronous callback happening on the thread that adds the data to the list
void dataChanged(short[] theData) {
list.add(theData);
}
//thread that iterates over the list and processes the current data it contains
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
for(short[] item : list) {
//process the data
}
//clear the list to discared of data which has been processed.
list.clear();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
+1 Это путь! – assylias
+1 правильный способ разработки решения – Stephan