疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

线程间通信


 

       线程之间能够方便的基于共享地址空间实现通信,这本身。便是多线程应用程序的一大优势,因为进程之间是不能互访对方的地址空间的。在进程之间传递信息只能采用类似于远程调用的手段。

  本文主要讲在线程之间实现二进制信息和字符串的传输。

  传递二进制信息

  利用java.io.PipedOutputStream和java.io.PipedInputStream可以实现线程之间的二进制信息传输。PipedOutputStream是OutputStream直接子类,而.PipedInputStream是InputStream直接子类。

  与OutputStream和InputStream的重要区别在于:PipedOutputStream拥有一个允许指定输入管道流的构造方法,而PipedInputStream拥有一个允许指定输出管道流的构造方法。

  下面例子就是线程之间二进制信息传递

  Java代码 收藏代码

  package com.thread.test;

  import java.io.IOException;

  import java.io.PipedInputStream;

  import java.io.PipedOutputStream;

  public class CommunicationThread {

  static PipedOutputStream pos=null;

  static PipedInputStream pis=null;

  public static void main(String[] args) {

  pos=new PipedOutputStream();

  try {

  pis=new PipedInputStream(pos);

  } catch (IOException e1) {

  // TODO Auto-generated catch block

  e1.printStackTrace();

  }

  Thread t1=new Thread(){

  @Override

  public void run() {

  try {

  pos.write("您好,金先生".getBytes());

  } catch (IOException e) {

  // TODO Auto-generated catch block

  e.printStackTrace();

  }

  }

  };

  t1.start();

  Thread t2=new Thread(){

  @Override

  public void run() {

  try {

  byte[] bytes=new byte[pis.available()];

  pis.read(bytes,0,bytes.length);

  System.out.println(new String(bytes));

  } catch (IOException e) {

  // TODO Auto-generated catch block

  e.printStackTrace();

  }

  }

  };

  t2.start();

  }

  }

  传递字符信息

  利用java.io.PipedWriter和java.io.PipedReader在线程之间传输字符信息。与上文的类似。

  下面给出一个例子

  Java代码 收藏代码

  package com.thread.test;

  import java.io.BufferedReader;

  import java.io.BufferedWriter;

  import java.io.IOException;

  import java.io.PipedReader;

  import java.io.PipedWriter;

  public class CommunicationThread {

  // static PipedOutputStream pos=null;

  // static PipedInputStream pis=null;

  static PipedWriter pw=null;

  static PipedReader pr=null;

  static BufferedWriter bw=null;

  static BufferedReader br=null;

  public static void main(String[] args) throws IOException {

  pw=new PipedWriter();

  pr=new PipedReader(pw);

  bw=new BufferedWriter(pw);

  br=new BufferedReader(pr);

  // pos=new PipedOutputStream();

  // try {

  // pis=new PipedInputStream(pos);

  // } catch (IOException e1) {

  // // TODO Auto-generated catch block

  // e1.printStackTrace();

  // }

  Thread t1=new Thread(){

  @Override

  public void run() {

  try {

  // pos.write("您好,金先生".getBytes());

  bw.write("hello,jincm", 0,"hello,jincm".length());

  bw.newLine();

  bw.flush();

  } catch (IOException e) {

  // TODO Auto-generated catch block

  e.printStackTrace();

  }//www.sctarena.com

  }

  };

  t1.start();

  Thread t2=new Thread(){

  @Override

  public void run() {

  try {

  // byte[] bytes=new byte[pis.available()];

  // pis.read(bytes,0,bytes.length);

  System.out.println(br.readLine());

  } catch (IOException e) {

  // TODO Auto-generated catch block

  e.printStackTrace();

  }

  }

  };

  t2.start();

  }

  }

  疯狂软件学院拥有十年的技术积累,完善而雄厚的师资,由国内著名疯狂Java体系书籍作者李刚老师担任首席讲师,疯狂Java精英讲师团队肖文吉、李韩飞等现场授课。有最好的教程以及最多的实战经验!疯狂Java的教学质量只能用两个字形容:“强悍”,用三个字形容就是:“太强悍”。选择广州Java培训,走康庄大道。疯狂java培训抢座热线:020-28309358,020-28309378咨询QQ:707552864,544627560