Прерывание потока ввода

169
26 сентября 2019, 16:20

Допустим есть у меня отдельный поток который в цикле while ожидает ответ от сервера, например:

while (!Thread.interrupted()) {
    // InputStream.read()
    // Какие-то действия
}

И допустим я из вне хочу прервать этот поток командой Thread.interrupt(). Тогда, как я понимаю, поток не прервется до тех пор, пока он не примет сообщение, не обработает его, и уже возвращаясь к условию цикла не прервется. Как прервать поток ввода, не дожидаясь ответа?

Answer 1

В Java реализация потоков зависит от реализации JVM, а именно:

  1. Вам не повезло и JVM реализует не преемптивную многопоточность - тогда да, пока не будет прочитан кусок - ничего не произойдет
  2. Вам повезло и JVM реализует преемптивную многопоточность, тогда неважно в каком состоянии находится поток - будет выкинуто исключение InterruptedException

Скорее всего вам повезет, потому что в современных версиях Windows/Linux JVM использует механизм многопоточности предоставляемый ОСом, а там в Windows/Linux нормальная многопоточность с квантованием процессорного времени и проч. бантиками.

Answer 2

Для того чтоб тормознуть поток, надо в нем установить флаг interrupted в true, а в самом потоке мониторить этот флаг, и если он равен true, выбросить исключение InterruptedException.

Посмотрите здесь Oracle tutorials interrupts

READ ALSO
Переменная и ее объем

Переменная и ее объем

Занимает ли переменная место в куче при объявлении? Иными словами, если я захочу объявить переменную, повлияет ли это на объем используемой...

130
Компоненты GUI и объект события

Компоненты GUI и объект события

Как заставить компонент GUI(кнопку, например) передать в метод класса-слушателя параметр?

130
Проверка возвратил ли что-то SQLite select

Проверка возвратил ли что-то SQLite select

как я могу проверить, вернул ли что-то данный запрос? ResultSet rs = stmtexecuteQuery( "SELECT * FROM USERS WHERE NICK ='" + nick + "';" ); (Я хочу проверить имеется ли запись...

129
Вызываю из статического блока метод, не инициализирует

Вызываю из статического блока метод, не инициализирует

Из статического блока вызываю метод который инициализирует массив (причем в самом методе это видно - выводит 35)Но когда обращаюсь в коде - оказывается...

128