java多線程編程之管道通信詳解
上一章節(jié)講了wait/notify通信,這一節(jié)我們來探討使用管道進(jìn)行通信。
java中提供了IO流使我們很方便的對(duì)數(shù)據(jù)進(jìn)行操作,pipeStream是一種特殊的流,用于不同線程間直接傳送數(shù)據(jù)。一個(gè)線程將數(shù)據(jù)發(fā)送到輸出管道,另一個(gè)線程從輸入管道讀取數(shù)據(jù)。通過管道實(shí)現(xiàn)通信不需要借助臨時(shí)文件這類東西。
java中提供了四個(gè)類使得線程間可以通信:
①字節(jié)流:PipeInputStream,PipedOutputStream
②字符流:PipedReader,PipedWriter
下面我們看看字節(jié)流的實(shí)現(xiàn)方法:
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;
//測(cè)試方法
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();
//輸出流與輸入流進(jìn)行連接。
outputStream.connect(inputStream);
//inputStream.connect(outputStream);
ThreadRead readThread=new ThreadRead(read,inputStream);
readThread.start();//先啟動(dòng)輸出線程
Thread.sleep(2000);
ThreadWrite writeThread=new ThreadWrite(write,outputStream);
writeThread.start();//后啟動(dòng)輸入線程
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
控制臺(tái)輸出:
read:
write:
123456789101112131415161718192021...
123456789101112131415161718192021...
上面測(cè)試中,先啟動(dòng)輸入線程,然后因?yàn)闆]有線程被寫入所以線程被阻塞,知道有數(shù)據(jù)寫入。
我們接著繼續(xù)看看字符流的實(shí)現(xiàn)方法:
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;
//測(cè)試方法
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();
}
}
}
字符流額字節(jié)流大同小異,上面的例子中字符流不需要?jiǎng)?chuàng)建字節(jié)數(shù)組而已。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
解決fastjson從1.1.41升級(jí)到1.2.28后報(bào)錯(cuò)問題詳解
這篇文章主要介紹了解決fastjson從1.1.41升級(jí)到1.2.28后報(bào)錯(cuò)問題詳解,需要的朋友可以參考下2020-02-02
設(shè)計(jì)模式系列之組合模式及其在JDK和MyBatis源碼中的運(yùn)用詳解
這篇文章主要介紹了組合模式及其在JDK和MyBatis源碼中的運(yùn)用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
解決PageHelper的上下文問題導(dǎo)致SQL查詢結(jié)果不正確
主要介紹了PageHelper在使用過程中出現(xiàn)的分頁上下文問題,并分析了可能的原因和解決方案,主要解決方案包括每次分頁查詢后調(diào)用`PageHelper.clearPage()`清理分頁上下文,確保每次查詢前正確調(diào)用`startPage`,以及避免在條件判斷未執(zhí)行SQL時(shí)影響后續(xù)查詢2024-12-12
Java中使用jaxp進(jìn)行sax解析_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
使用SAX的優(yōu)勢(shì)在于其解析速度較快,相對(duì)于DOM而言占用內(nèi)存較少。這篇文章主要介紹了Java中使用jaxp進(jìn)行sax解析,需要的朋友可以參考下2017-08-08
Spring實(shí)現(xiàn)類私有方法的幾個(gè)問題(親測(cè)通用解決方案)
現(xiàn)實(shí)的業(yè)務(wù)場(chǎng)景中,可能需要對(duì)Spring的實(shí)現(xiàn)類的私有方法進(jìn)行測(cè)試。本文給大家分享Spring實(shí)現(xiàn)類私有方法面臨的幾個(gè)問題及解決方案,感興趣的朋友跟隨小編一起看看吧2021-06-06
SpringBoot接口路徑重復(fù),啟動(dòng)服務(wù)器失敗的解決
這篇文章主要介紹了SpringBoot接口路徑重復(fù),啟動(dòng)服務(wù)器失敗的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
一篇超詳細(xì)的SpringBoot整合MybatisPlus的文章
這篇文章主要介紹了springboot整合Mybatis-plus的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-07-07

