Вот что происходит: запускается EVEN, счетчик увеличивается до 1, а затем в следующем getData
начинается ожидание. Затем запускается ODD, увеличивает счетчик до 2, а затем тоже начинает ждать в getData
. У вас есть два потока, ожидающих без шансов на пробуждение.
Чтобы исправить это, вы должны уведомить, когда условие, в котором поток ожидает изменений. То есть: уведомить после sd.counter++
, чтобы другой поток мог проснуться. Поскольку другой поток ожидает sd
, вы должны вызвать:
sd.counter++
sd.notify()
Также обратите внимание, что потоки ODD и EVEN идентичны. Вы можете иметь один класс, реализующий поток, и создавать его два экземпляра.