Сообщение Re[2]: Юнит-тестирование и интерфейс потоков от 21.04.2020 15:03
Изменено 21.04.2020 15:09 f95.2
Re[2]: Юнит-тестирование и интерфейс потоков
С этими классами напоролся на неожиданную проблему:
Допустим, поток читатель ждет (т.е. использует блокирующее чтение) данных в потоке.
В это время другой поток определил, что пользователь хочет завершить программу.
Нужно как-то вывести поток-читатель из заблокированного состояния.
Как?
Thread.interrupt? Это некрасиво, да и вроде бы interrupt считается устаревшим.
Я пытался закрыть InputStream с расчетом на то, что блокирующее чтение выбросит исключение, и поток сможет определить,
что читать дальше не надо.
Но исключение почему-то не выбласывается.
Вот пример программы, на которой воспроизводится подобное поведение?
Как тогда правильно разбудить читающий поток?
Допустим, поток читатель ждет (т.е. использует блокирующее чтение) данных в потоке.
В это время другой поток определил, что пользователь хочет завершить программу.
Нужно как-то вывести поток-читатель из заблокированного состояния.
Как?
Thread.interrupt? Это некрасиво, да и вроде бы interrupt считается устаревшим.
Я пытался закрыть InputStream с расчетом на то, что блокирующее чтение выбросит исключение, и поток сможет определить,
что читать дальше не надо.
Но исключение почему-то не выбласывается.
Вот пример программы, на которой воспроизводится подобное поведение?
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
public class Main {
public static void main(String[] args) throws IOException, InterruptedException {
PipedInputStream in = new PipedInputStream();
PipedOutputStream pipedHelper = new PipedOutputStream(in);
Thread th = new Thread(() -> {
try {
in.read();
} catch (IOException e) {
System.out.println("Exception in thread");
}
});
th.start();
Thread.sleep(1000);
in.close();
th.join();
System.out.println("Done");
}
}
Как тогда правильно разбудить читающий поток?
Re[2]: Юнит-тестирование и интерфейс потоков
С этими классами напоролся на неожиданную проблему:
Допустим, поток читатель ждет (т.е. использует блокирующее чтение) данных в потоке.
В это время другой поток определил, что пользователь хочет завершить программу.
Нужно как-то вывести поток-читатель из заблокированного состояния.
Как?
Thread.interrupt? Это некрасиво, да и вроде бы interrupt считается устаревшим.
Я пытался закрыть InputStream с расчетом на то, что блокирующее чтение выбросит исключение, и поток сможет определить,
что читать дальше не надо.
Но исключение почему-то не выбласывается.
Вот пример программы, на которой воспроизводится подобное поведение:
Основной поток ждет на th.join(), а дополнительный — на in.read().
Как правильно разбудить читающий поток?
Допустим, поток читатель ждет (т.е. использует блокирующее чтение) данных в потоке.
В это время другой поток определил, что пользователь хочет завершить программу.
Нужно как-то вывести поток-читатель из заблокированного состояния.
Как?
Thread.interrupt? Это некрасиво, да и вроде бы interrupt считается устаревшим.
Я пытался закрыть InputStream с расчетом на то, что блокирующее чтение выбросит исключение, и поток сможет определить,
что читать дальше не надо.
Но исключение почему-то не выбласывается.
Вот пример программы, на которой воспроизводится подобное поведение:
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
public class Main {
public static void main(String[] args) throws IOException, InterruptedException {
PipedInputStream in = new PipedInputStream();
PipedOutputStream pipedHelper = new PipedOutputStream(in);
Thread th = new Thread(() -> {
try {
in.read();
} catch (IOException e) {
System.out.println("Exception in thread");
}
});
th.start();
Thread.sleep(1000);
in.close();
th.join();
System.out.println("Done");
}
}
Основной поток ждет на th.join(), а дополнительный — на in.read().
Как правильно разбудить читающий поток?