Ну, я вот думаю о таком подходе - когда у меня несколько потоков, выполняющих похожие действия в бесконечном цикле, я создаю Queue(), типа “служебную очередь”, и кидаю ссылку на нее в конструктор потоков. Каждый поток пытается на каждой итерации цикла неблокирующе прочитать служебное сообщение из очереди, если очередь пуста - то просто идет дальше. Если нет - то читает сообщение.
Например, если мне надо убить все потоки - я посылаю строчку “EXIT”, и поток, который ее извлекает из очереди, тут же кладет ее обратно и завершает харакири, и т.д.
Интересно другие варианты послушать.