У вас есть два потока.
Поток 1 печатает нечётные числа.
Поток 2 печатает чётные числа.
Как их синхронизировать так, чтобы вывод всегда шёл по порядку:
1 2 3 4 5…
Звучит просто, но заставляет внимательно подумать о координации потоков.
Ответ
Самый аккуратный способ это использовать семафоры.
Семафор управляет набором разрешений (токенов). Поток, вызывающий
acquire, забирает разрешение, и если его нет — ждёт. Поток, вызывающий release, возвращает разрешение, чем будит ожидающий поток.Мы создаём два семафора: один для нечётных, другой для чётных.
Семафор для нечётных изначально имеет 1 разрешение, чтобы первый поток мог стартовать, а для чётных — 0, чтобы он ждал. После того как нечётный поток печатает число, он делает
release для чётного. Чётный поток делает acquire, печатает, и отдаёт разрешение обратно нечётному.Такое чередование гарантирует точную последовательность 1 2 3 4 … без активного ожидания, без
sleep и без гонок.👉 Java Portal
