Вау, Нелли. Никогда не делай этого:
// Point F: Is there a better way to wait for this signal?
while (activeWorkerThreads > 0)
;
Вы вращаете и потребляете процессор. Используйте правильное уведомление:
Сначала: synchronize
для объекта, , затем , проверьте activeWorkerThreads и wait()
для объекта, если он все еще> 0:
synchronized (mutexObject) {
while (activeWorkerThreads > 0) {
mutexObject.wait();
}
}
Второе: попросите рабочих уведомить () объект после того, как они уменьшат счет activeWorkerThreads. Вы должны синхронизироваться на объекте перед вызовом notify.
synchronized (mutexObject) {
activeWorkerThreads--;
mutexObject.notify();
}
В-третьих: видя, как вы (после реализации 1 и 2) синхронизируете объект, всякий раз, когда вы касаетесь activeWorkerThreads, используйте его в качестве защиты; нет необходимости, чтобы переменная была изменчивой.
Тогда: тот же объект, который вы используете в качестве мьютекса для управления доступом к activeWorkerThreads, также может использоваться для управления доступом к isShutdown. Пример:
synchronized (mutexObject) {
if (isShutdown) {
return;
}
}
Это не приведет к тому, что работники будут блокировать друг друга, за исключением неизмеримо небольшого количества времени (которого вы, скорее всего, не избежите, используя блокировку чтения-записи).