Методы класса 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() способом синхронизации? Нет.