Java线程——线程间通信

因为进程之间不能互访对方的地址空间,在进程之间传替消息只能采用类似于远程调用的手段。这就让多线程之间的通信更加显得有优势。
目录
(1)、传递二进制消息
(2)、传递字符信息

正文
(1)、传递二进制消息
主要用到java.io.PipedOutputStream拥有允许指定输入管道流的构造方法
java.io.PipedInputStream拥有一个指定输出管道流的构造方法。
案例如下:

import java.io.PipedOutputStream;
import java.io.PipedInputStream;
import java.io.IOException;

public class CommunicationByPipeBytes
{
      static PipedOutputStream pos=null;
    static PipedInputStream pis=null;

    public static void main(String[] args) throws IOException
    {
          pos=new PipedOutputStream();
        pis=new PipedInputStream(pos);

        Thread thread1=new Thread()
        {
            public void run()
            {
                  try
                  {
                      pos.write("hello".getBytes());
                      pos.flush();
                  }
                  catch(IOException ioe)
                  {
                      ioe.printStackTrace();
                  }
            }
        };
        thread1.start();

        Thread thread2=new Thread()
        {
               public void run()
               {
                   try
                   {
                       byte[] bytes=new byte[pis.available()];
                       pis.read(bytes,0,bytes.length);
                       System.out.println(new String(bytes));
                   }
                   catch(IOException ioe)
                   {
                       ioe.printStackTrace();
                   }    
               }
        };
        thread2.start();
    }
}

运行结果:

E:\>java CommunicationByPipeBytes
hello

这个案例实现了二进制信息的传递:线程Thread1通过管道字节流向线程Thread2传递字符“hello”的字节。

(2)、传递字符信息
利用java.io.PipedWriter拥有指定允许输入管道字符流的构造方法
java.io.PipedReader拥有一个指定输出管道字符流的构造方法。
案例如下:

import java.io.PipedWriter;
import java.io.PipedReader;
import java.io.BufferedWriter;
import java.io.BufferedReader;
import java.io.IOException;

public class CommunicationByPipeCharacters
{
      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);

        Thread thread1=new Thread()
        {
            public void run()
            {
                  try
                  {
                      bw.write("hello",0,"hello".length());
                      bw.newLine();
                      bw.flush();
                  }
                  catch(IOException ioe)
                  {
                      ioe.printStackTrace();
                  }
            }
        };
        thread1.start();

        Thread thread2=new Thread()
        {
               public void run()
               {
                   try
                   {
                       System.out.println(br.readLine());
                   }
                   catch(IOException ioe)
                   {
                       ioe.printStackTrace();
                   }    
               }
        };
        thread2.start();
    }
}

运行结果同上。只是使用的方式有些不一样。

你可能感兴趣的:(Java线程,java,线程,多线程,通信,二进制)