Возможно, вам будет лучше:
public void run()
{
while (true) {
task = getNextTask(); // blocks until task available
if (task == null)
break;
}
}
getNextTask () возвращает ноль, если пришло время прекратить работу. В качестве альтернативы, проверьте «task == STOP_TASK» и установите любой код, который в данный момент установлен, на выполнение = false после STOP_TASK в очередь задач.
Другой подход состоит в том, чтобы использовать Thread.interrupt (), чтобы разбудить спящего, но это всегда выглядит как-то неряшливо. : -)
Если вы сохраняете описанный выше подход, убедитесь, что «рабочий» объявлен как volatile, если он может быть изменен другим потоком.