java.io.IOException:使用pipeWriter和pipeReader时显示管道关闭

java.io.IOException:使用pipeWriter和pipeReader时显示管道关闭,java,multithreading,pipeline,Java,Multithreading,Pipeline,我正在尝试实现一个解释管道和管线数据流体系结构的程序。 我有一个数据源和许多过滤器,数据源类在管道上写入一个字符数组(使用PipeWriter),第一个过滤器从管道读取数组并将字符转换为大写,然后将大写字符数组写入同一管道,以便下一个过滤器读取,依此类推。 我在应用程序中使用多线程。 下面是一些代码,可以解释我正在尝试执行的操作: public class DataSource implements Runnable{ PipedWriter pw; public char[] c

我正在尝试实现一个解释管道和管线数据流体系结构的程序。 我有一个数据源和许多过滤器,数据源类在管道上写入一个字符数组(使用PipeWriter),第一个过滤器从管道读取数组并将字符转换为大写,然后将大写字符数组写入同一管道,以便下一个过滤器读取,依此类推。 我在应用程序中使用多线程。 下面是一些代码,可以解释我正在尝试执行的操作:

public class DataSource implements Runnable{
   PipedWriter pw;
   public char[] c  = {'e','a','b','c','e','c','a','f','e','d'};
   public DataSource(PipedWriter pw){
        this.pw = pw;
   }

public  synchronized  void run() {
    try {
        pw.write(c);
        pw.write(-1);
        pw.close();
    } catch (IOException ex) {
        Logger.getLogger(DataSource.class.getName()).log(Level.SEVERE, null, ex);
    }


}
 }

}

下面是我如何测试代码的:

 public static  void facadDetails(){
    PipedWriter pw = null;
    PipedReader pr = null;
    try {
        // TODO code application logic here
        pr = new PipedReader();
        pw = new PipedWriter(pr);
        DataSource dso = new DataSource(pw);
        UpperCaseConversionFilter f1 = new UpperCaseConversionFilter(pr,pw);

        new Thread(dso).start();
        new Thread(f1).start();

    } catch (IOException ex) {
        Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
    }
    }



     }
谁能帮我解决这个问题

“然后将大写字符数组写入同一管道,以便下一个过滤器读取”-这是错误的。如果写入同一个管道,它将被自身读取(形成无限循环),而不是下一个过滤器

我猜你想要的是:

数据源=>pw1->pr1=>UpperCaseConversionFilter=>pw2->pr2=>next filter


因此,您需要2对或更多(PipedWriter、PipedReader)。

我真的需要帮助!!我不知道问题出在哪里,这是我第一次处理PipeReader和Writer:(:(
 public static  void facadDetails(){
    PipedWriter pw = null;
    PipedReader pr = null;
    try {
        // TODO code application logic here
        pr = new PipedReader();
        pw = new PipedWriter(pr);
        DataSource dso = new DataSource(pw);
        UpperCaseConversionFilter f1 = new UpperCaseConversionFilter(pr,pw);

        new Thread(dso).start();
        new Thread(f1).start();

    } catch (IOException ex) {
        Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
    }
    }



     }