Количество фолдеров и файлов заранее неизвестно.
Нужно обойти все элементы сверху вниз и обработать используя многопоточность.
Имеется некий синхронизированный SharedState к которому все потоки имеют доступ
(SharedState к тому же persistant но суть это не меняет)
Вопрос - как понять что обход дерева завершен ?
Интересует не имплементация а идея.
вариантов имплементаций море - весь арсенал жава многопоточности + akka.
в голову пока пришел такой вариант: иметь отдельный поток который валидирует этот SharedState.
предположить что каждый элемент не может обрабатываться дольше чем maxThreshold.
пример рекурсивного судокода чисто для пояснения идеи.
обработка
Code: Select all
@Async //this wraps each call with thread/worker
processAsync (element, state) {
process(element)
List children = element.getChildren()
children.each{
state.incrementSubmitted()
processAsync(it, state)
}
state.incrementCompleted()
}
Code: Select all
if (state.intervalSinceLatUpdate>maxThreshold && state.submitted == state.completed) {
state.done()
}