public class Solution {
    public static volatile int countSeconds = 3;

    public static void main(String[] args) throws InterruptedException {
        RacingClock clock = new RacingClock();
        Thread.sleep(3500);
        clock.interrupt();



    }

    public static class RacingClock extends Thread {
        public RacingClock() {
            start();
        }

        public void run() {
            try {
                while (!currentThread().isInterrupted()) {
                    if (countSeconds == 0) {
                        System.out.println("Марш!");
                        currentThread().interrupt();
                    }
                    else {
                        System.out.print(countSeconds + " ");
                        Thread.sleep(1000);
                        countSeconds--;
                    }

                }
            }
            catch (InterruptedException e) {
                System.out.println("Прервано!");

            }
        }
    }
}
Решил задачу случайно, после того как дописал sout в блок catch. Путем тестов, выяснил что разница между "Марш" и "Прервано " появляется в зависимости от того, в какое значение устанавливать thread.sleep в главном потоке. Правильно ли я понимаю, что когда значение (3500), второй поток не успевает отработать до выполнения условия (countSeconds == 0). Вместо него просыпается главный поток и делает clock.interrupt, чем вызывает исключение в блоке try-catch, который впоследствии выкидывает "Прервано" ?