Основная проблема в вашей проблеме возникает, когда поток User
хочет поместить грязную Dish
в чистую посудомоечную машину.
Решение простое. Создайте еще один Dishwasher
объект.
Один Dishwasher
держит грязную посуду в ожидании, чтобы почистить ее, другой - недавно очищенную посуду.
Когда Dishwasher
, содержащий чистую посуду, пуст, начните чистить грязную посуду в другой Dishwasher
.
В этот момент потоки User
могут помещать грязную посуду в то, что раньше было Dishwasher
(которое теперь пусто).
Продолжайте чередовать роли двух Dishwashers
бесконечно. User
нити всегда могут выпасть из грязной тарелки без необходимости KitchenCounterBuffer
.
Примечание: это решение не решает проблему голодания. User
резьба все еще может блокировать ожидание завершения очистки посудомоечной машиной.
Примечание 2: В стесненных условиях, где Dishwasher
является одиночным, укажите KitchenCounterBuffer
, а также DishwasherOperator
, чтобы убрать посуду и поместить грязные блюда от KitchenCounterBuffer
до Dishwasher
. Затем KitchenCounterBuffer
принимает роль грязного Dishwasher
в приведенном выше алгоритме. Однако это может привести к тому, что потоки User
сгенерируют исключения или умрут.