Лучше иметь условие завершения в строке while (...)
, но иногда условие завершения - это то, что вы можете проверить только где-то глубоко внутри цикла. Тогда это то, что break
для (или исключения). На самом деле, возможно, ваш поток должен работать вечно, пока ваша программа не завершится (с System.exit
); тогда while (true)
определенно прав.
Но, может быть, вы спрашиваете, что должно быть внутри цикла. Вы должны обязательно включить некоторую блокирующую операцию, то есть некоторый вызов функции, когда ваш поток будет ждать, пока кто-то другой (другой поток, другая программа, ОС) сделает что-то. Обычно это Condition.wait
, если вы программируете с блокировками, либо читаете из очереди сообщений, либо читаете из файла или сетевого сокета, либо выполняете какую-либо другую блокирующую операцию ввода-вывода.
Обратите внимание, что sleep
обычно не достаточно достаточно хорошо. Вы не можете знать, когда другие участники собираются что-то делать, поэтому нет способа избежать слишком частого пробуждения (что приводит к чрезмерной загрузке процессорного времени) или слишком редко (что не позволяет своевременно реагировать на события). Всегда проектируйте свою систему так, чтобы, когда поток завершил свою работу, он уведомлял того, кто ожидает эту работу (часто с помощью Condition.signal
или присоединением).