Re[4]: Юнит-тестирование и интерфейс потоков
От: f95.2  
Дата: 22.04.20 00:42
Оценка:
·>Тут надо закрывать писателя pipedHelper.close()

Так а что делать, если известен только InputStream?
Еще раз, есть вот такой объект:
// Сообщения специального формата. Парсятся из входного потока, ответы на них пишутся в выходной поток
class Message {
    ....
}


class Proxy {
    public Proxy(InputStream in, OutputStream out, Consumer<Message> cons) {
        ....
    }

    public void stop() {
        ....
    }
}


При создании объект Proxy внутри себя запускает вспомогательные потоки. В них он ждет данных из входного потока,
пишет данные в выходной поток, периодически вызывает пользовательский обработчик, аргумент которого — распарсенное сообщение.

Предполагается, что в реальной жизни потоки будут взяты с сокета, а в тестах — созданы руками.
Но сам класс не знает, где он запускается, и видит только InputStream и OutputStream.

В один прекрасный момент из главного потока (так проще, про вызов из обработчика я еще подумаю) вызывается Proxy.stop(),
который ждет, пока Proxy остановит все свои потоки и освободит все занятые ресурсы.

Как это сделать, если некоторые потоки заблокированы на чтении данных?
Я поначалу хотел просто закрыть входящий поток, но, похоже, этого недостаточно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.