JAVA多线程-线程间通信(三)-通过管道进行线程间通信
2016-02-20 18:02
891 查看
通过管道进行线程间通信
管道流(pipeStream):用于在不同线程间直接传送数据。
Java的JDK中提供了四个类来使线程间通信,我们这里也可以复习一下java中流的使用。
1)PipedInputStream 和 PipedOutputStream
2)PipedWriter 和PipedReader
项目案例:我们采用字节流去实现两个线程间的数据传输。(字符流的原理类似)
package org.jksoft.thread.pipe;
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
/**
* 测试一:利用管道字节流,进行线程间通信
*
* @author mcl
*
* 2016-2-20-下午4:03:48
*/
public class Test1 {
// 准备一个发送流的类
class WriterUtil {
public void write(PipedOutputStream out) {
System.out.println("开始写。。。");
for (int i = 0; i < 300; i++) {
try {
out.write(("" + (i + 1)).getBytes());
System.out.print("" + (i + 1));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
System.out.println();
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
// 准备一个接收流的类
class ReaderUtil {
public void read(PipedInputStream in) {
System.out.println("开始读。。。");
byte[] buf = new byte[20];
try {
int length = in.read(buf);
while (length != -1) {
System.out.print(new String(buf, 0, length));
length = in.read(buf);
}
System.out.println();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
// 准备一个发送流的线程
class WThread extends Thread {
private WriterUtil writerUtil;
private PipedOutputStream out;
public WThread(WriterUtil writerUtil, PipedOutputStream out) {
this.writerUtil = writerUtil;
this.out = out;
}
public void run() {
writerUtil.write(out);
}
}
// 准备一个接收流的线程
class RThread extends Thread {
private ReaderUtil readerUtil;
private PipedInputStream in;
public RThread(ReaderUtil readerUtil, PipedInputStream in) {
this.readerUtil = readerUtil;
this.in = in;
}
public void run() {
readerUtil.read(in);
}
}
// 主方法
public static void main(String[] args) throws InterruptedException {
Test1 test1 = new Test1() ;
ReaderUtil readerUtil = test1.new ReaderUtil();
PipedInputStream in = new PipedInputStream();
WriterUtil writerUtil = test1.new WriterUtil();
PipedOutputStream out = new PipedOutputStream();
try {
out.connect(in);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
RThread r =test1.new RThread(readerUtil, in);
WThread w =test1.new WThread(writerUtil, out);
r.start();
Thread.sleep(2000);
w.start();
}
}
运行结果:
管道流(pipeStream):用于在不同线程间直接传送数据。
Java的JDK中提供了四个类来使线程间通信,我们这里也可以复习一下java中流的使用。
1)PipedInputStream 和 PipedOutputStream
2)PipedWriter 和PipedReader
项目案例:我们采用字节流去实现两个线程间的数据传输。(字符流的原理类似)
package org.jksoft.thread.pipe;
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
/**
* 测试一:利用管道字节流,进行线程间通信
*
* @author mcl
*
* 2016-2-20-下午4:03:48
*/
public class Test1 {
// 准备一个发送流的类
class WriterUtil {
public void write(PipedOutputStream out) {
System.out.println("开始写。。。");
for (int i = 0; i < 300; i++) {
try {
out.write(("" + (i + 1)).getBytes());
System.out.print("" + (i + 1));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
System.out.println();
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
// 准备一个接收流的类
class ReaderUtil {
public void read(PipedInputStream in) {
System.out.println("开始读。。。");
byte[] buf = new byte[20];
try {
int length = in.read(buf);
while (length != -1) {
System.out.print(new String(buf, 0, length));
length = in.read(buf);
}
System.out.println();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
// 准备一个发送流的线程
class WThread extends Thread {
private WriterUtil writerUtil;
private PipedOutputStream out;
public WThread(WriterUtil writerUtil, PipedOutputStream out) {
this.writerUtil = writerUtil;
this.out = out;
}
public void run() {
writerUtil.write(out);
}
}
// 准备一个接收流的线程
class RThread extends Thread {
private ReaderUtil readerUtil;
private PipedInputStream in;
public RThread(ReaderUtil readerUtil, PipedInputStream in) {
this.readerUtil = readerUtil;
this.in = in;
}
public void run() {
readerUtil.read(in);
}
}
// 主方法
public static void main(String[] args) throws InterruptedException {
Test1 test1 = new Test1() ;
ReaderUtil readerUtil = test1.new ReaderUtil();
PipedInputStream in = new PipedInputStream();
WriterUtil writerUtil = test1.new WriterUtil();
PipedOutputStream out = new PipedOutputStream();
try {
out.connect(in);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
RThread r =test1.new RThread(readerUtil, in);
WThread w =test1.new WThread(writerUtil, out);
r.start();
Thread.sleep(2000);
w.start();
}
}
运行结果:
相关文章推荐
- How to improve Java's I/O performance( 提升 java i/o 性能)
- eclipse在异常关闭后,导致无法启动workspace问题的解决
- 关于$.ajaxFileUpload()上传图片
- 解决Java接口内部类的main()方法无法打印输出的问题
- java反射学习
- Eclipse配置PyDev插件
- Java 序列化Serializable详解(附详细例子)
- Spring 多数据源事务配置问题
- Java集合类的区别
- 安卓开发工具Eclipse、SDK等升级攻略
- Java enum(枚举)的用法详解(转)
- freemaker-eclipse-plugin 安装
- Java中普通代码块,构造代码块,静态代码块区别及代码示例
- java synchronized关键字以及对线程锁的理解
- java语言学习笔记1
- JAVA WEB 批量文件下载
- java分布式对象RMI应用测试用例
- jvm学习笔记二(java内存分配策略和回收策略)
- Android SDK镜像的介绍使用(eclipse)
- 详解java垃圾回收机制