как сделать непрерывный цикл без исключения - PullRequest
0 голосов
/ 21 ноября 2018

Пожалуйста, внимательно прочитайте текст, заголовок не так хорош, но я не мог придумать, как проще описать проблему.

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

Программа имеет 2 потока:
поток A - взаимодействует с пользователем, который может добавлять или удалять элементы.набор
поток B - постоянно перебирать множество, выполняющее задачи над его элементами

Как я могу выполнить этот сценарий, не имея ConcurrentModificationException?

final Set<String> set = new HashSet();

//A
new Thread(new Runnable(){
public void run(){
while(true){

//user adds or remove items to set

}
}
}).start();


new Thread(new Runnable(){
public void run(){
while(true){

for(String s : set){
//do stuff
}

}
}
}).start();

Этоочень общий сценарий должен быть шаблон проектирования, чтобы справиться с этим

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Какой смысл повторять бесконечно?Может быть, достаточно перебрать множество, когда оно изменилось?Тогда вы можете использовать шаблон наблюдателя.

0 голосов
/ 21 ноября 2018

Вы можете использовать CopyOnWriteArraySet

Например

Set<Integer> threadSafeSet = new CopyOnWriteArraySet<>();

Доступ к вышеуказанному набору теперь можно получить из любого потока без ConcurrentModificationExceptions.Но это не в реальном времени, то есть набор может измениться, и это не будет отражено в текущей итерации.Это недостаток в пользу многопоточного итератора

...