这篇文章主要为大家详细介绍了java多线程编程之线程间的通信,探讨使用管道进行通信,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
上一章节讲了wait/notify通信,这一节我们来探讨使用管道进行通信。
java中提供了io流使我们很方便的对数据进行操作,pipestream是一种特殊的流,用于不同线程间直接传送数据。一个线程将数据发送到输出管道,另一个线程从输入管道读取数据。通过管道实现通信不需要借助临时文件这类东西。
java中提供了四个类使得线程间可以通信:
①字节流:pipeinputstream,pipedoutputstream
②字符流:pipedreader,pipedwriter
下面我们看看字节流的实现方法:
package pipeinputoutput;
//输出流
import java.io.ioexception;
import java.io.pipedoutputstream;
public class writedate {
public void writemethod(pipedoutputstream out) {
try {
system.out.println("write:");
for(int i=0;i<300;i++) {
string outdate=""+(i+1);
out.write(outdate.getbytes());
system.out.print(outdate);
}
system.out.println();
out.close();
}catch(ioexception e) {
e.printstacktrace();
}
}
}
package pipeinputoutput;
//输入流
import java.io.ioexception;
import java.io.pipedinputstream;
public class readdate {
public void readdate(pipedinputstream input) {
try {
system.out.println("read:");
byte[] bytearray=new byte[20];
int readlength=input.read(bytearray);
while(readlength!=-1) {
string newdate=new string(bytearray,0,readlength);
system.out.print(newdate);
readlength=input.read(bytearray);
}
system.out.println();
input.close();
}catch(ioexception e){
e.printstacktrace();
}
}
}
package pipeinputoutput;
import java.io.pipedoutputstream;
//输出线程
public class threadwrite extends thread {
private writedate write;
private pipedoutputstream out;
public threadwrite(writedate write,pipedoutputstream out) {
super();
this.write=write;
this.out=out;
}
public void run() {
write.writemethod(out);
}
}
package pipeinputoutput;
import java.io.pipedinputstream;
//输入线程
public class threadread extends thread{
private readdate read;
private pipedinputstream in;
public threadread(readdate read,pipedinputstream in) {
super();
this.read=read;
this.in=in;
}
public void run() {
read.readdate(in);
}
}
package pipeinputoutput;
import java.io.ioexception;
import java.io.pipedinputstream;
import java.io.pipedoutputstream;
//测试方法
public class run {
public static void main(string[] args) {
try {
writedate write=new writedate();
readdate read=new readdate();
pipedinputstream inputstream=new pipedinputstream();
pipedoutputstream outputstream=new pipedoutputstream();
//输出流与输入流进行连接。
outputstream.connect(inputstream);
//inputstream.connect(outputstream);
threadread readthread=new threadread(read,inputstream);
readthread.start();//先启动输出线程
thread.sleep(2000);
threadwrite writethread=new threadwrite(write,outputstream);
writethread.start();//后启动输入线程
} catch (ioexception e) {
e.printstacktrace();
} catch (interruptedexception e) {
e.printstacktrace();
}
}
}
控制台输出:
read:
write:
123456789101112131415161718192021...
123456789101112131415161718192021...
上面测试中,先启动输入线程,然后因为没有线程被写入所以线程被阻塞,知道有数据写入。
我们接着继续看看字符流的实现方法:
package pipeinputoutput1;
import java.io.ioexception;
import java.io.pipedwriter;
//字符输出流
public class writedate {
public void writemethod(pipedwriter out) {
try {
system.out.println("write:");
for(int i=0;i<300;i++) {
string outdate=""+(i+1);
out.write(outdate);
system.out.print(outdate);
}
system.out.println();
out.close();
}catch(ioexception e) {
e.printstacktrace();
}
}
}
package pipeinputoutput1;
import java.io.ioexception;
import java.io.pipedreader;
//字符输入流
public class readdate {
public void readmethod(pipedreader in) {
try {
system.out.println("read:");
char[] bytearray=new char[20];
int readlength=in.read(bytearray);
while(readlength!=-1) {
string newdate=new string(bytearray,0,readlength);
system.out.print(newdate);
readlength=in.read(bytearray);
}
system.out.println();
in.close();
} catch (ioexception e) {
e.printstacktrace();
}
}
}
package pipeinputoutput1;
import java.io.pipedwriter;
//输出流线程
public class writethread extends thread {
private writedate write;
private pipedwriter out;
public writethread(writedate write,pipedwriter out) {
super();
this.write=write;
this.out=out;
}
public void run() {
write.writemethod(out);
}
}
package pipeinputoutput1;
import java.io.pipedreader;
//输入流线程
public class readthread extends thread{
private readdate read;
private pipedreader in;
public readthread(readdate read,pipedreader in) {
super();
this.read=read;
this.in=in;
}
public void run() {
read.readmethod(in);
}
}
package pipeinputoutput1;
import java.io.ioexception;
import java.io.pipedreader;
import java.io.pipedwriter;
//测试方法
public class run {
public static void main(string[] args) {
try {
writedate write=new writedate();
readdate read=new readdate();
pipedwriter out=new pipedwriter();
pipedreader in=new pipedreader();
//连接输出流与输入流
out.connect(in);
//in.connect(out);
readthread threadread=new readthread(read,in);
threadread.start();
thread.sleep(2000);
writethread threadwrite=new writethread(write,out);
threadwrite.start();
} catch (ioexception e) {
e.printstacktrace();
} catch (interruptedexception e) {
e.printstacktrace();
}
}
}
字符流额字节流大同小异,上面的例子中字符流不需要创建字节数组而已。
以上就是java多线程编之管道通信的实例分析的详细内容。