Это можно реализовать через
ReentrantReadWriteLock. Управляющий поток захватывает writeLock, а рабочие потоки в точке остановки захватывают readLock (на время какого-то действия, наверное). Они могут захватить readLock все одновременно, но только, если writeLock не захвачен.
Вообще не знаю зачем вам
просто останавливать потоки. Обычно возникает потребность останавливать потоки перед выполнением какого-то действия, которое должно быть защищено. Если у вас просто остановка без защиты следующего за ней действия, то представьте такой вариант:
1. Блокировка свободна.
2. Рабочий поток перепрыгивает точку остановки.
3. Сразу после этого ОС переключает управление на управляющий поток.
4. Управляющий поток захватывает блокировку.
5. ОС переключает управление обратно на рабочий поток.
6. Рабочий поток выполняет код
за точкой остановки (блокировка при этом
захвачена в управляющем потоке).
Теперь скажите чем этот результат отличается от того, как если бы рабочий поток просто перепрыгнул бы точку остановки при захваченной блокировке?