Прерывание потока с помощью ShutdownHook не закрывает ресурсыJAVA

Программисты JAVA общаются здесь
Anonymous
Прерывание потока с помощью ShutdownHook не закрывает ресурсы

Сообщение Anonymous »

У меня есть следующий код с функцией try-with-resources, которая создает два ресурса и работает нормально:

Код: Выделить всё

public class SimpleResourceExample {

public static void main(String... args) {
try (var resource1 = new Resource(1);
var resource2 = new Resource(2)) {
System.out.println("Using "+resource1 +" and "+resource2);
Thread.sleep(20 * 1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}

private record Resource(int id) implements AutoCloseable {
@Override
public void close() {
System.out.println("Closing resource "+id);
}
}
}
Итак, когда я запускаю его, я получаю следующий результат (через 20 секунд):

Код: Выделить всё

Using Resource[id=1] and Resource[id=2]
Closing resource 2
Closing resource 1

Process finished with exit code 0
И когда я добавляю приведенный ниже код (в main(), непосредственно перед try-with-resources), чтобы прервать поток, он также работает нормально:

Код: Выделить всё

        var t = Thread.currentThread();
new Thread(() -> {
try {
Thread.sleep(10 * 1000);
t.interrupt();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}).start();
Итак, этот новый поток прерывает основной поток через 10 секунд, и ресурсы также закрываются, с выводом ниже:

Код: Выделить всё

Using Resource[id=1] and Resource[id=2]
Closing resource 2
Closing resource 1
Exception in thread "main" java.lang.RuntimeException: java.lang.InterruptedException: sleep interrupted
at ....

Process finished with exit code 1

(трассировка стека опущена для краткости)
Но когда я ввожу перехватчик завершения работы с приведенным ниже кодом:

Код: Выделить всё

        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
System.out.println("Shutting down");
t.interrupt();
}));
И запустите его с помощью этой команды:

Код: Выделить всё

kill -15
Я получаю следующий результат:

Код: Выделить всё

Using Resource[id=1] and Resource[id=2]
Shutting down

Process finished with exit code 143 (interrupted by signal 15:SIGTERM)
Это означает, что он получает сигнал и останавливает приложение. И я думаю, что он также отправляет прерывание в основной поток, но не закрывает ресурсы.
Кто-нибудь знает, почему это происходит и как обеспечить закрытие ресурсов?
Спасибо.

Подробнее здесь: https://stackoverflow.com/questions/787 ... -resources

Вернуться в «JAVA»