如何将PipedReader连接到PipedWriter,而它们位于不同的线程上?

时间:2011-11-10 18:16:59

标签: java multithreading

正如标题所说,模拟代码来说明我的问题

驱动程序类

  import java.io.*;

    public class driver
    {

        public static void main(String[] args)
        {
            PipedWriter writer1 = new PipedWriter();
            PipedWriter writer2 = new PipedWriter();
            PipedReader reader1 = new PipedReader();
            PipedReader reader2 = new PipedReader();

            Thread thread1 = new MyThread(writer1, reader1);
            Thread thread2 = new MyThread(writer2, reader2);
            try
            {
                  writer2.connect(reader1);
             } catch(Exception e)
             {
                  e.printStackTrace();
             }
        }
    }

MyThread Class

 import java.io.*;
public class MyThread extends Thread
{
    PipedReader input = new PipedReader();
    PipedWriter output = new PipedWriter();

    public MyThread(PipedWriter input, PipedReader output)
    {
        try
        {
            this.input.connect(input);
            this.output.connect(output);
        } catch(Exception e)
        {
            e.printStackTrace();            
               }
    }
    public void run()
    {
        try
        {
            input.close();
            output.close();
        }catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}

我不确定.connect方法是否应该使用。我想要做的是让第一个线程的输出流直接写入第二个线程的输入流。

上面的代码编译得很好但是说它已经连接了。

java.io.IOException: Already connected
        at java.io.PipedWriter.connect(Unknown Source)
        at driver.main(driver.java:17)

2 个答案:

答案 0 :(得分:2)

如果作者连接到阅读器,则阅读器也连接到作者。您不需要连接它们两次。如果一个线程写入而另一个线程读取,则只需要一个写入器和一个读取器。

在主线程中创建两者,连接它们,然后使用reader创建一个线程,使用writer创建一个线程,并启动两个线程。

答案 1 :(得分:0)

您正在为Thread类中的编写器和读取器进行一些不必要的初始化。只需挂接传递给构造函数的实例并将它们连接起来。伪代码:

import java.io.*;
public class MyThread extends Thread
{
    PipedReader input = null;
    PipedWriter output = null;

    public MyThread(PipedWriter input, PipedReader output)
    {
        this.input = input;
        this.output = output;

        this.output.connect(input);
    }
}

阅读PipedWriter和读者here