Я думаю, что это то, что вы хотите:
private final Thread thisThread = Thread.current();
private final int timeToRun = 120000; // 2 minutes;
new Thread(new Runnable() {
public void run() {
sleep(timeToRun);
thisThread.interrupt();
}
}).start();
while (!Thread.interrupted()) {
// do something interesting.
}
Это позволяет избежать повторных системных вызовов для получения значения системных часов (что может быть довольно дорого) и вместо этого опрашивает флаг interrupted
текущего потока (намного дешевле).
РЕДАКТИРОВАТЬ
На самом деле нет сейфа альтернативы опросу часов или опроса флага. Теоретически, вы можете изменить приведенный выше фрагмент так, чтобы он вызывал устаревший метод Thread.stop()
вместо Thread.interrupt()
.
(я НЕ рекомендую использовать Thread.stop()
и друзей. Они несовершенны и опасны в использовании. Я просто представляю это как теоретическую альтернативу.)
РЕДАКТИРОВАТЬ 2
Просто отметим, что использование Thread.interrupt()
имеет преимущества перед установкой общего флага:
Thread.interrupt () приведет к тому, что определенные блокирующие операции ввода-вывода и методы синхронизации будут разблокированы и выдано проверенное исключение. Обновление общего флага не сделает этого.
Некоторые сторонние библиотеки также проверяют флаг прерывания, чтобы увидеть, должны ли они прекратить то, что они делают в настоящее время.
Если ваш цикл включает в себя вызовы других методов и т. Д., Thread.interrupt () означает, что вам не нужно беспокоиться о том, что эти методы могут получить доступ к флагу ... если это необходимо.
РЕДАКТИРОВАТЬ 3
Просто добавим, что sleep(N)
не гарантирует пробуждение спящего потока через ровно N
миллисекунды. Но при нормальных обстоятельствах это будет достаточно близко.