PipedInputStream - Как избежать “java.io. IOException: Канал повреждается”

Мне нравится заключать Дзэн Peters в кавычки Python. "Явный лучше, чем неявный".

В Java и C++, 'this.' может быть выведен, кроме тех случаев, когда у Вас есть имена переменной, которые лишают возможности выводить. Таким образом, Вы иногда нуждаетесь в нем и иногда делаете нет.

Python выбирает делать вещи как это явными, а не на основе правила.

Кроме того, так как ничто не подразумевается или предполагается, части реализации представлены. self.__class__, self.__dict__ и другие "внутренние" структуры доступны очевидным способом.

19
задан levanovd 8 December 2009 в 11:12
поделиться

3 ответа

Используйте java.util.concurrent.CountDownLatch и не завершайте первый поток, пока второй не сообщит о завершении чтения из канала.

Обновление: быстрое и грязное код для иллюстрации моего комментария ниже

    final PipedInputStream pin = getInputStream();
    final PipedOutputStream pout = getOutputStream();

    final CountDownLatch latch = new CountDownLatch(1);

    InputStream in = new InputStream() {

        @Override
        public int read() throws IOException {
            return pin.read();
        }

        @Override
        public void close() throws IOException {
            super.close();
            latch.countDown();
        }
    };


    OutputStream out = new OutputStream(){

        @Override
        public void write(int b) throws IOException {
            pout.write(b);
        }

        @Override
        public void close() throws IOException {
            while(latch.getCount()!=0) {
                try {
                    latch.await();
                } catch (InterruptedException e) {
                    //too bad
                }
            }
            super.close();
        }
    };

    //give the streams to your threads, they don't know a latch ever existed
    threadOne.feed(in);
    threadTwo.feed(out);
18
ответ дан 30 November 2019 в 04:20
поделиться

Вы закрываете свой PipedOutputStream , когда поток, который его использует, завершается? Вам необходимо сделать это, чтобы байты в нем были сброшены в соответствующий PipedInputStream .

8
ответ дан 30 November 2019 в 04:20
поделиться

PipedInputStream and PipedOutputStream are broken (with regards to threading). They assume each instance is bound to a particular thread. This is bizarre. I suggest using your own (or at least a different) implementation.

1
ответ дан 30 November 2019 в 04:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: