У меня есть многопоточная программа, которая работает в структуре, подобной каталогу (AWS S3), для обновления элементов в каталогах.
Структура исправлена.На верхнем уровне у меня есть каталоги, и под каждым каталогом у меня есть только элементы файла.У меня есть базовый поток, который порождает задачи для элементов в каждом каталоге, чтобы обновить каждый элемент в pararel.У меня есть реализация fork fork с монитором для управления параллелизмом.
Я вызываю эту функцию для каждого каталога, и она порождает подзадачи для элементов в каждом каталоге.К сожалению, почти все мои темы ждут и никогда не просыпаются.Хотя есть один поток, который работает нормально и обновляет элементы, но это очень медленно.Я не знаю, почему у меня есть потоки, которые ожидают и никогда не пробуждаются.
void compute() {
try {
if (isFileItem()) {
updateItem();
synchronized (isBaseThreadFinished) {
while (!isBaseThreadFinished.get()) {
isBaseThreadFinished.wait();
}
}
if (atomicInt.decrementAndGet() == 0) {
markDirectoryAsCompleted()
}
} else {
ObjectListing listings = s3Client.listObjects(bucketName, key);
processListings(listings.getObjectSummaries());
while (listings.isTruncated()) {
listings = s3Client.listNextBatchOfObjects(listings);
processListings(listings.getObjectSummaries());
atomicInt.incrementBy(listings.length())
}
synchronized (isBaseThreadFinished) {
isBaseThreadFinished.set(true);
isBaseThreadFinished.notifyAll();
}
}
} catch {...}
Я не понимаю, как поток мог ждать вечно с этим кодом, потому что поток каталога (тот, который порождаетсначала выполняются подзадачи), а затем завершаются и освобождаются все ожидающие потоки.