Когда мы попробуем Threads.sleep в нашем коде, мы должны поймать InterruptedException. Это означает, что нить не смогла спать в течение времени, которое мы указали, не так ли? Итак, как можно прерывать поток, который мы спали? Может ли кто-нибудь объяснить эту концепцию?Java Thread.sleep
ответ
Как можно прервать нить? Я могу называть его Thread.interrupt().
От here:
Прерывание является показанием к потоку, который он должен остановить то, что он делает и делать что-то другое. Программист должен решить точно, как поток отвечает на прерывание, но очень часто бывает для завершения потока. Это использование подчеркивается в этом уроке .
Стоит прочитать this article from JavaSpecialists, чтобы понять, как обращаться с прерываниями чисто.
Java Concurrency In Practice (Peierls, Bloch, Bowbeer, Holmes, Lea)
Например, если приложение закрываются, а этот поток спит.
Это может быть прервано сигналом тревоги или другим внешним событием.
Прерывание прерывания происходит, если поток проснулся раньше заданного времени.
Execption вызывается только для того, чтобы дать вам (поток) возможность обработки специального корпуса.
В наиболее распространенных случаях вам не нужно ловить эту процедуру. Я предпочитаю маленький помощник для этого:
public class Sleeper {
private static final Logger log = Logger.getLogger(Sleeper.class);
/**
* @param time
* @param units
* @return milliseconds
*/
public static long sleepUnsafe(final long time, final TimeUnit units) {
final long start = System.currentTimeMillis();
final long millis = TimeUnit.MILLISECONDS.convert(time, units);
try {
Thread.sleep(millis);
} catch (final InterruptedException e) {
final long end = System.currentTimeMillis();
final long timeSlept = end - start;
final long difference = millis - timeSlept;
if (difference > 0) {
Sleeper.log.warn("should sleep for " + time + " " + units + ". But was awaked after " + (end - start) + " ms. Diffence is " + difference
+ "ms.");
return difference;
}
}
return 0;
}
/**
*
* @param millis
* @return
*/
public static long sleepUnsafe(final long millis) {
return Sleeper.sleepUnsafe(millis, TimeUnit.MILLISECONDS);
}
}
Как сказал Брайан Agnew, исключение sleep()
является реакция на interrupt()
. Концепция здесь заключается в том, что поток должен обеспечивать способы остановить себя; если он не спит, он должен проверять статус прерывания время от времени через interrupted()
или isInterrupted()
и реагировать соответствующим образом. Но если поток спал, и мы хотим отменить его выполнение, мы будем обречены: нить будет просто спать, не хотелось бы искать флаг interrupted
. Но вот что такое встроенное поведение sleep()
: если поток прерывается до завершения сна, мы получаем InterruptedException.
- 1. java - thread.sleep() внутри SwingWorker
- 2. Java: Thread.sleep mousepress delay
- 3. Thread.sleep(); в Java
- 4. java timer и thread.sleep
- 5. Java Thread.sleep утечки потоков?
- 6. Java Thread.sleep запрос
- 7. Java многопоточной объем Thread.sleep
- 8. Java runOnUiThread и Thread.sleep
- 9. Java Thread.sleep Exception
- 10. Java - альтернатива thread.sleep
- 11. Java Trident Library и Thread.sleep()
- 12. Java Swing Animation без Thread.sleep
- 13. Почему Java send требует Thread.Sleep
- 14. Моделирование Java Thread.sleep() в WM
- 15. Java Thread.sleep long или int?
- 16. Альтернатива для Thread.sleep() в java
- 17. Java - Thread.sleep в основном методе
- 18. Разве Java Thread.sleep() освобождает процессор?
- 19. Thread.sleep зовущего Thread.sleep
- 20. Java: Thread.sleep() внутри цикла while не работает
- 21. Время Schedular в Java с Thread.sleep
- 22. Java thread.sleep (1) спящий более 1 мс
- 23. Java Thread.sleep() не работает должным образом
- 24. вызов Thread.sleep() из синхронизированного контекста в Java
- 25. Что эквивалентно Java Thread.sleep() в JavaScript?
- 26. Java: Thread.sleep() в потоке: no wait
- 27. Java Memory Behavior: Different with Thread.sleep
- 28. Есть ли альтернатива Thread.sleep в Java
- 29. Проблема с производительностью Java с Thread.sleep()
- 30. thread.sleep (5000); и TimerThread.sleep (5000); в Java
О чем вы говорите? Не Java, конечно. –