Записать конечное мертвое исключение, используя PipedInputStream Java - PullRequest
8 голосов
/ 28 марта 2011

Исключение при окончании записи возникает в следующей ситуации: Два потока:

A: PipedOutputStream put = new PipedOutputStream();
   String msg = "MESSAGE";
   output.wirte(msg.getBytes());
   output.flush();

B: PipedInputStream get = new PipedOutputStream(A.put);  
   byte[] get_msg = new byte[1024];
   get.read(get_msg);

Вот ситуация: A и B работают одновременно, и A записывает в канал, а B читает его.B только что прочитал из трубы и буфер этой трубы очищен.Тогда A не записывает сообщение в канал в неизвестном интервале.Однако в один момент B снова читает канал и появляется java.io.IOException: write end dead, потому что буфер канала все еще пуст.И я не хочу спать () поток B, чтобы ждать, пока A пишет канал, что также нестабильно.Как избежать этой проблемы и решить ее?Спасибо

Ответы [ 2 ]

17 голосов
/ 19 апреля 2015

Исключения «конец записи» появятся, если у вас есть:

  • PipedInputStream, подключенный к PipedOutputStream и
  • Концы этих каналов читаются / пишутся двумя разными потоками
  • Резьба заканчивается, не закрывая свою сторону трубы.

Чтобы устранить это исключение, просто закройте ваш поток Piped в исполняемом потоке после того, как вы закончили запись и чтение байтов в / из потока канала.

Вот пример кода:

final PipedOutputStream output = new PipedOutputStream();
final PipedInputStream input = new PipedInputStream(output);

    Thread thread1 = new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                output.write("Hello Piped Streams!! Used for Inter Thread Communication".getBytes());                       
                output.close();

            } catch(IOException io) {
                io.printStackTrace();
            }                   
        }
    });

    Thread thread2 = new Thread(new Runnable() {
        @Override
        public void run() {

            try {

                int data;

                while((data = input.read()) != -1) {
                    System.out.println(data + " ===> " + (char)data);
                }

                input.close();

            } catch(IOException io) {
                io.printStackTrace();
            } 

        }
    });

    thread1.start();
    thread2.start();

Полный код здесь: https://github.com/prabhash1785/Java/blob/master/JavaCodeSnippets/src/com/prabhash/java/io/PipedStreams.java

Для получения более подробной информации, пожалуйста, посмотрите на этот хороший блог: https://techtavern.wordpress.com/2008/07/16/whats-this-ioexception-write-end-dead/

4 голосов
/ 13 ноября 2014

вам нужно закрыть PipedOutputStream до того, как закончится запись потока (и, конечно же, после записи всех данных).PipedInputStream генерирует это исключение в read (), когда нет записывающего потока и писатель не закрыт должным образом

...