Re[2]: Юнит-тестирование и интерфейс потоков
От: f95.2  
Дата: 21.04.20 15:03
Оценка:
С этими классами напоролся на неожиданную проблему:
Допустим, поток читатель ждет (т.е. использует блокирующее чтение) данных в потоке.
В это время другой поток определил, что пользователь хочет завершить программу.

Нужно как-то вывести поток-читатель из заблокированного состояния.
Как?
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().

Как правильно разбудить читающий поток?
Отредактировано 21.04.2020 15:09 f95.2 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.