Почему этот код заставляет несколько потоков ждать блокировки, которая не удерживается - PullRequest
0 голосов
/ 07 июня 2018

У меня есть многопоточная программа, которая работает в структуре, подобной каталогу (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 {...}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...