/*
需求:用多线程来操作IO流,这个流是管道流,可以操作多线程,熟悉并使用它;
思路:整体思路:多线程块和管道流块
   管道流块:
  1 定义管道输出流,PipedOutputStream pos;
      2 定义管道输入流,pipedInputStream pis;
  3 使用管道输入流对象调用connect方法,将两个流连接起来,即pis.connect(pos);
   多线程块:
   1 定义一个输入类,实现Runnable接口,将管道输入流对象作为数据成员,其他构造函数同样的
   2 覆盖run方法,将操作输入流的代码封装进该方法中,加不加锁看自己
   3 定义一个输出类,实现Runnable接口,将管道输出流对象作为数据成员,其它的跟普通的多线程代码块相似
   4 覆盖run方法,将操作输出流的代码封装进该方法中;
   主函数中:
       创建管道输入输出流对象,将其传入定义好的输入输出类的构造函数中,用管道输入流类对象调用connect函数,将管道
   输出流对象传入connect方法中,将两者接起来;
   定义Threa的对象,将输入输出类对象传入Thread的构造方法中
   然后调用Thread的start开启线程
   注意:包的导入,异常处理
步骤:
*/
package pipedstream;
import java.io.*;
class Read implements Runnable
{
PipedInputStream pis;
Read(PipedInputStream pis)
{
this.pis=pis;
}
public void run()
{
System.out.println("管道输入流线程开启");
try
{
System.out.prinln("没有数据,先阻塞一会儿");
Thread.sleep(5000);
byte[]buf=new byte[1024];
int len=pis.read(buf);
String s=new String(buf,0,len);
System.out.println(s);
}
catch(IOException ioe)
{
throw new RuntimeException("管道输入流异常");
}
finally
{
try
{
if(pis!=null)
pis.close();
}
catch(IOException ioe)
{
throw new RuntimeException("管道输入流关闭异常");
}
}
}
}
class Write implements Runnable
{
PipedOutputStream pos;
Write(PipedOutputStream pos)
{
this.pos=pos;
}
public void run()
{
System.out.println("管道输出流线程开启");
try
{
pos.write("pipedstream is start".getBytes());
}
catch(IOException ioe)
{
throw new RuntimeException("管道输出流异常");
}
finally
{
try
{
if(pos!=null)
pos.close();
}
catch(IOException ioe)
{
throw new RuntimeException("管道输出流关闭异常");
}

}
}
}
class PipedStreamTest
{
public static void main(String []args)
{

PipedInputStream pis=new PipedInputStream();
Read r=new Read(pis);
PipedOutputStream pos=new PipedOutputStream();
Write w=new Write(pos);
try
{
pis.connect(pos);
}
catch(IOException ioe)
{
throw new RuntimeException("管道输入输出流连接异常");
}
new Thread(w).start();
new Thread(r).start();
}
}
编译没有问题,运行时发生如下情况
D:\javaprog\830>java pipedstream.PipedStreamTest
管道输入流线程开启
Exception in thread "Thread-0" 管道输出流线程开启
Exception in thread "Thread-1" java.lang.RuntimeException: 管道输入流异常
        at pipedstream.Read.run(PipedStream.java:49)
        at java.lang.Thread.run(Thread.java:722)
java.lang.RuntimeException: 管道输出流异常
        at pipedstream.Write.run(PipedStream.java:81)
        at java.lang.Thread.run(Thread.java:722)
求解释

解决方案 »

  1.   

    你catch异常的方式很不好,导致异常的真实信息被隐藏,就很难给你有效建议了。catch(IOException ioe)
    {
    throw new RuntimeException("管道输入流异常");
    }建议全部都修改为:
    catch(IOException ioe)
    {
    throw new RuntimeException("管道输入流异常", ioe); // 要把异常继承下去
    }这样再重新试试看,应该能看到详细的错误信息。
      

  2.   

    /*
    需求:用多线程来操作IO流,这个流是管道流,可以操作多线程,熟悉并使用它;
    思路:整体思路:多线程块和管道流块
       管道流块:
      1 定义管道输出流,PipedOutputStream pos;
          2 定义管道输入流,pipedInputStream pis;
      3 使用管道输入流对象调用connect方法,将两个流连接起来,即pis.connect(pos);
       多线程块:
       1 定义一个输入类,实现Runnable接口,将管道输入流对象作为数据成员,其他构造函数同样的
       2 覆盖run方法,将操作输入流的代码封装进该方法中,加不加锁看自己
       3 定义一个输出类,实现Runnable接口,将管道输出流对象作为数据成员,其它的跟普通的多线程代码块相似
       4 覆盖run方法,将操作输出流的代码封装进该方法中;
       主函数中:
           创建管道输入输出流对象,将其传入定义好的输入输出类的构造函数中,用管道输入流类对象调用connect函数,将管道
       输出流对象传入connect方法中,将两者接起来;
       定义Threa的对象,将输入输出类对象传入Thread的构造方法中
       然后调用Thread的start开启线程
       注意:包的导入,异常处理
    步骤:
    */
    package pipedstream;
    import java.io.*;
    //import java.util.*;
    class Read implements Runnable
    {
    PipedInputStream pis;
    Read(PipedInputStream pis)
    {
    this.pis=pis;
    }
    public void run()
    {
    System.out.println("管道输入流线程开启");
    try
    {
    System.out.println("没有数据,先阻塞一会儿");
    try
    {
    Thread.sleep(5000);
    }
    catch(InterruptedException ie)
    {

    }
    byte[]buf=new byte[1024];
    int len=pis.read(buf);
    String s=new String(buf,0,len);
    System.out.println(s);
    }
    catch(IOException ioe)
    {
    throw new RuntimeException("管道输入流异常",ioe);
    }
    finally
    {
    try
    {
    if(pis!=null)
    pis.close();
    }
    catch(IOException ioe)
    {
    throw new RuntimeException("管道输入流关闭异常",ioe);
    }
    }
    }
    }
    class Write implements Runnable
    {
    PipedOutputStream pos;
    Write(PipedOutputStream pos)
    {
    this.pos=pos;
    }
    public void run()
    {
    System.out.println("管道输出流线程开启");
    try
    {
    pos.write("pipedstream is start".getBytes());
    }
    catch(IOException ioe)
    {
    throw new RuntimeException("管道输出流异常",ioe);
    }
    finally
    {
    try
    {
    if(pos!=null)
    pos.close();
    }
    catch(IOException ioe)
    {
    throw new RuntimeException("管道输出流关闭异常",ioe);
    }

    }
    }
    }
    class PipedStreamTest
    {
    public static void main(String []args)
    {

    PipedInputStream pis=new PipedInputStream();
    Read r=new Read(pis);
    PipedOutputStream pos=new PipedOutputStream();
    Write w=new Write(pos);
    try
    {
    pis.connect(pos);
    }
    catch(IOException ioe)
    {
    throw new RuntimeException("管道输入输出流连接异常",ioe);
    }
    new Thread(w).start();
    new Thread(r).start();
    }
    }
    大虾就是大虾啊,照你说的改了一下,编译和运行都通过了!可是这样多加一个ioe到构造函数中有什么作用呢?原谅菜鸟的无知与啰嗦!十分感谢!!