>  기사  >  Java  >  Java 멀티스레드 프로그래밍의 파이프라인 통신 분석 예

Java 멀티스레드 프로그래밍의 파이프라인 통신 분석 예

黄舟
黄舟원래의
2017-10-19 09:54:491792검색

이 글에서는 주로 Java 멀티스레드 프로그래밍에서 스레드 간 통신을 자세히 소개하고, 통신을 위한 파이프라인의 사용에 대해 논의합니다. 관심 있는 친구들은 참고할 수 있습니다.

이전 장에서는 통신 대기/알림에 대해 설명했습니다. , 이 섹션에서는 통신을 위해 파이프를 사용하는 방법에 대해 설명합니다.

Java는 데이터 작업을 쉽게 해주는 IO 스트림을 제공합니다. PipeStream은 서로 다른 스레드 간에 데이터를 직접 전송하는 데 사용되는 특수 스트림입니다. 한 스레드는 출력 파이프로 데이터를 보내고 다른 스레드는 입력 파이프에서 데이터를 읽습니다. 파이프를 통한 통신에는 임시 파일을 사용할 필요가 없습니다.

Java는 스레드 간 통신을 가능하게 하는 네 가지 클래스를 제공합니다.

1바이트 스트림: PipeInputStream, PipedOutputStream
2문자 스트림: 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:
1234567891011121314 15161718192021...
12 3456789101112131415161718192021...

위는 테스트 중입니다. 먼저 입력 스레드는 시작된 다음에는 쓰레드가 없기 때문에 데이터가 쓰일 때까지 쓰레드가 차단됩니다.

계속해서 문자 스트림의 구현 방법을 살펴보겠습니다.


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 멀티스레드 프로그래밍의 파이프라인 통신 분석 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.