Информация об изменениях

Сообщение Re[2]: Юнит-тестирование и интерфейс потоков от 21.04.2020 15:03

Изменено 21.04.2020 15:09 f95.2

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

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

Но исключение почему-то не выбласывается.
Вот пример программы, на которой воспроизводится подобное поведение:

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().

Как правильно разбудить читающий поток?