Синхронизация потоков на примере задачи "один - несколько"

Примитивная задача, но поставила в ступор из-за ряда факторов. Есть кормушка и несколько животных в виде потока.

public static void main(String[] args) {
    for (int i = 0; i < 10); i++) {
        new Thread(new Animal()).start();
}

public void run() {
    while (!Thread.currentThread().isInterrupted()) {
        eat(5);
}

Из 10000 шт. корма животные съедают по 5. Синхронизацию делаю на объекте feeder, чтобы они не взяли лишнего.

public void eat(int count) {
    synchronized (feeder) {
        if (feeder.count <= 0) {
            Thread.currentThread().interrupt();
        } else if (count <= feeder.count) {
            feeder.count -= count;
        } else {
            feeder.count = 0;
            Thread.currentThread().interrupt();
        }
    }
    ...

Для эксперимента, чтобы животные ели равномернее, решил добавить сочетание notify-wait. Для этого пришлось дополнительно сделать метод eat синхронизированным.

    ...
    notifyAll();
    wait();
}

Как себе представляю это я: первый поток зашел, сделал бесполезный нотифай, заснул. Следующий сделал то же самое, заснул. У меня wait срабатывает только при определенном условии, а не каждый раз, просто решил избавить вас от не относящегося к вопросу кода.

Однако, потоки просто засыпают и не просыпаются. Почему так происходит? И может быть лучше как-то по-другому это сделать?


Ответы (1 шт):

Автор решения: yeahbaby

Додумался. Я работаю с разными объектами Animal и с одним объектом Feeder. Для обеспечения работоспособности нужно было всего-навсего метод сделать не в классе Animal, а в классе Feeder. Тогда synchronized метод, notify и wait стали правильно работать.

→ Ссылка