Вопрос по потокам в Java

161
30 апреля 2019, 17:10

Есть класс Clock, наследуемый от Thread с методом run().

public static class Clock extends Thread {
    private int seconds;
    @Override
    public void run() {
        try {               
            while (!currentThread().isInterrupted()) {
                Thread.sleep(1000);
                seconds++;
                System.out.println(seconds);
            }
        } catch (InterruptedException e) {
            System.out.println("Конец отсчета.");
        }
    }
}

Метод main(), где запускаем поток, ждем 5 секунд, потом вызывается метод clock.interrupt().

public static void main(String[] args) throws InterruptedException {
        Clock clock = new Clock();
        clock.start();
        Thread.sleep(5000);
        clock.interrupt();
}

Вопрос: Почему после вызова метода clock.interrupt() отрабатывает catch. Ведь по идее !currentThread().isInterrupted() должен стать false, и перестать работать цикл, следовательно поток(нить) clock должен закончить свою работу выполнив только то, что в try.

Answer 1

Потому что метод Thread.sleep(long) выбрасывает исключение в случае если поток был прерван(был вызван метод Thread.interrupt()). Про это можно почитать в офф. документации.

InterruptedException - if any thread has interrupted the current thread. The interrupted status of the current thread is cleared when this exception is thrown.

Answer 2

Условие while (!currentThread().isInterrupted()) может отработать только в том случае, если вы вызовете clock.interrupt() в течение этих двух операций:

seconds++;
System.out.println(seconds);

Если же clock.interrupt() будет вызван в течение работы Thread.sleep(1000); (что вероятно почти на 100%) исключение будет выброшено мгновенно и перехвачено в catch (InterruptedException e)

READ ALSO
Помогите правильно указать путь к файлу

Помогите правильно указать путь к файлу

Положил изображение в папку "res", но не получается его подгрузитьПри сборке jar файла изображение не отображается

197
collection framework java

collection framework java

Помогите, пожалуйста, сделать, я уже неделю сижу над этим заданием и просто ничего не получается, так как важным условием еще есть не использовать...

199
Реализация интерфейса Comparable

Реализация интерфейса Comparable

Помогите реализовать интерфейс для класса Per интерфейс Comparable

192
Может кто-то объяснить код построчно? [закрыт]

Может кто-то объяснить код построчно? [закрыт]

Это часть большого кода, в котором есть три четыре класса: OnlineStore, Good, ProductSearchSrvice и класс, где происходят основные действия и, где находиться...

217