/*
需求:用多线程来操作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)
求解释
需求:用多线程来操作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)
求解释
{
throw new RuntimeException("管道输入流异常");
}建议全部都修改为:
catch(IOException ioe)
{
throw new RuntimeException("管道输入流异常", ioe); // 要把异常继承下去
}这样再重新试试看,应该能看到详细的错误信息。
需求:用多线程来操作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到构造函数中有什么作用呢?原谅菜鸟的无知与啰嗦!十分感谢!!