黑马程序员技术交流社区
标题:
管道通信(PipedInputStream和PipedOutputStream)?
[打印本页]
作者:
逍林游
时间:
2013-1-24 09:01
标题:
管道通信(PipedInputStream和PipedOutputStream)?
本帖最后由 张向辉 于 2013-1-25 09:25 编辑
管道通信(PipedInputStream和PipedOutputStream)与进程通信中的write()和notify()的Synchronized同步有什么区别?你在管理机制相同吗?
作者:
yong230
时间:
2013-1-24 10:32
PipedInputStream和PipedOutputStream 两个管道流主要用来实现线程间通讯的,Synchronized关键字用来解决线程同步的,wait()和notify()是线程对象的两个方法,Synchronized、wait()和notify()一起使用可以很好的解决多线程资源同步问题。所以说两者的作用不同,线程间要通讯不一定要实现线程同步,反过来线程间要同步,线程间也不一定非要通讯。
作者:
pzfpang449
时间:
2013-1-24 10:36
楼主说的是不是管道通信中线程的问题。
管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信。
主要分为一下步骤:
首先建立管道流,并将管道流的输入输出对象进行链接;
将管道流加入到生产对象(线程)中;
通过管道流引出输入输出流,并在线程中对这些流进行操作;
注:管道流的的read的方法是一种阻塞方法;
public class CommunicateWhitPiping {
public static void main(String[] args) {
/**
* 创建管道输出流
*/
PipedOutputStream pos = new PipedOutputStream();
/**
* 创建管道输入流
*/
PipedInputStream pis = new PipedInputStream();
try {
/**
* 将管道输入流与输出流连接 此过程也可通过重载的构造函数来实现
*/
pos.connect(pis);
} catch (IOException e) {
e.printStackTrace();
}
/**
* 创建生产者线程
*/
Producer p = new Producer(pos);
/**
* 创建消费者线程
*/
Consumer c = new Consumer(pis);
/**
* 启动线程
*/
p.start();
c.start();
}
}
/**
* 生产者线程(与一个管道输入流相关联)
*
*/
class Producer extends Thread {
private PipedOutputStream pos;
public Producer(PipedOutputStream pos) {
this.pos = pos;
}
public void run() {
int i = 8;
try {
pos.write(i);
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 消费者线程(与一个管道输入流相关联)
*
*/
class Consumer extends Thread {
private PipedInputStream pis;
public Consumer(PipedInputStream pis) {
this.pis = pis;
}
public void run() {
try {
System.out.println(pis.read());
} catch (IOException e) {
e.printStackTrace();
}
}
}
希望对楼主有帮助
作者:
袭喜悦
时间:
2013-1-24 11:21
PipedInputStream与PipedOutputStream类用于在应用程序中的创建管道通信。管道通信即发送进程以字符流形式将大量数据送入管道,接收进程可从管道接收数据,二者利用管道进行通信。·使用PipedInputStream与PipedOutputStream类编写两个
线程
间进行通信的程序。
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
class Sender extends Thread{
PipedOutputStream out = new PipedOutputStream();
PipedOutputStream getPipedOutputStream(){
return out;
}
public void run(){
try {
out.write(new String("hello baby!").getBytes());
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class Receiver extends Thread{
PipedInputStream in = new PipedInputStream ();
PipedInputStream getPipedInputStream (){
return in;
}
public void run(){
byte[] b = new byte[1024];
try {
int len = in.read(b);
System.out.println("The following message comes from sender:/n"+
new String(b,0,len));
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class Inc {
public static void main(String[] args){
Sender sender = new Sender();
Receiver receiver = new Receiver();
PipedOutputStream out = sender.getPipedOutputStream();
PipedInputStream in = receiver.getPipedInputStream();
try {
out.connect(in);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
sender.start();
receiver.start();
}
}
复制代码
PipedWriter和PipedReader类
·使用管道流类,可以实现各个程序模块之间的松耦合通信。这样可以将多个模块的输入流和输出流相连,拼装成满足需要的应用程序,而不需要修改模块内部代码
作者:
金鑫
时间:
2013-1-24 14:35
问题是否已解决,如已解决请将帖子更改为已解决
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2