Методы класса Thread
| Метод | Смысл | Важная деталь |
|---|---|---|
start() | запустить новый поток | только один раз |
run() | тело задачи | прямой вызов не создает поток |
currentThread() | текущий Thread | статический метод |
sleep(duration) | приостановить текущий поток | держит уже захваченные мониторы |
join() | дождаться завершения другого потока | ожидание можно прервать |
interrupt() | запросить прерывание | не «убивает» поток |
isInterrupted() | прочитать флаг объекта | не очищает |
interrupted() | прочитать флаг текущего потока | статический, очищает |
yield() | подсказка планировщику | гарантий нет |
setDaemon() | назначить daemon до старта | после start() поздно |
setUncaughtExceptionHandler() | обработать необработанное исключение | поток уже завершается |
Thread worker = new Thread(task, "index-builder");
worker.setUncaughtExceptionHandler((thread, error) ->
log.error("Thread {} failed", thread.getName(), error));
worker.start();Методы stop(), suspend() и resume() deprecated и небезопасны: они могут оставить общий объект с нарушенным инвариантом или навсегда удержать монитор.
Методы sleep, yield и interrupted действуют на текущий поток, даже если статический метод ошибочно вызвать через переменную:
other.sleep(100); // компилируется, но спит текущий потокТак писать не нужно: Thread.sleep(100) выражает смысл явно.
На собеседовании
- Как отличить два метода проверки interrupt?
isInterrupted()проверяет выбранный поток и не сбрасывает флаг;Thread.interrupted()проверяет текущий и сбрасывает. - Освобождает ли
sleep()монитор? Нет. - Когда задают daemon? До
start(). - Можно ли считать
yield()способом синхронизации? Нет.