第七部分 线程间通信

来源:互联网 发布:通达网络智能办公系统 编辑:程序博客网 时间:2024/06/09 13:46

文章出自:http://blog.csdn.net/cuiran/article/details/6133745

线程间通信

我们所掌握的线程通信手段还只限于主线程通过唤醒,中断机制向子线程发出信号,或者在通过创建子线程时候向构造方法传入数据,以及设置子线程的公有属性。但是仅凭这些事难以胜任要求的。

 在多线程开发领域,线程与线程之间需要交换信息。这是一种普遍存在的需求。并不仅限于主线程和子线程之间。子线程和子线程之间也有可能需要交换信息。

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

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

传递二进制信息 

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

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

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

[java] view plaincopy
  1. /** 
  2.  * CommunicationByPipeBytes.java 
  3.  * 版权所有(C) 2011 cuiran2001@163.com 
  4.  * 创建:崔冉  2011-1-13 上午09:06:01 
  5.  */  
  6.   
  7. package com.cayden.thread731;  
  8.   
  9. import java.io.IOException;  
  10. import java.io.PipedInputStream;  
  11. import java.io.PipedOutputStream;  
  12.   
  13. /** 
  14.  * @author 崔冉 
  15.  * @version 1.0.0 
  16.  * @desc 
  17.  */  
  18. public class CommunicationByPipeBytes {  
  19.   
  20.     static PipedOutputStream pos=null;  
  21.     static PipedInputStream pis=null;  
  22.     /** 
  23.      * @param args 
  24.      */  
  25.     public static void main(String[] args) {  
  26.         // TODO Auto-generated method stub  
  27.         pos=new PipedOutputStream();  
  28.         try {  
  29.             pis=new PipedInputStream(pos);  
  30.         } catch (IOException e1) {  
  31.             // TODO Auto-generated catch block  
  32.             e1.printStackTrace();  
  33.         }  
  34.           
  35.         Thread thread1=new Thread(){  
  36.             public void run(){  
  37.                 try {  
  38.                     pos.write("Hello,Ha ha".getBytes());  
  39.                 } catch (IOException e) {  
  40.                     // TODO Auto-generated catch block  
  41.                     e.printStackTrace();  
  42.                 }  
  43.             }  
  44.         };  
  45.         thread1.start();  
  46.           
  47.         Thread thread2=new Thread(){  
  48.             public void run(){  
  49.                   
  50.                 try {  
  51.                     byte[] bytes=new byte[pis.available()];  
  52.                     pis.read(bytes,0,bytes.length);  
  53.                     System.out.println(new String(bytes));  
  54.                 } catch (IOException e) {  
  55.                     // TODO Auto-generated catch block  
  56.                     e.printStackTrace();  
  57.                 }  
  58.                   
  59.             }  
  60.         };  
  61.         thread2.start();  
  62.     }  
  63.   
  64. }  

运行结果如下:

[java] view plaincopy
  1. Hello,Ha ha  

传递字符信息

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

下面给出一个例子【CommunicationByPipeCharacters

[java] view plaincopy
  1. /** 
  2.  * CommunicationByPipeCharacters.java 
  3.  * 版权所有(C) 2011 cuiran2001@163.com 
  4.  * 创建:崔冉  2011-1-13 上午09:35:10 
  5.  */  
  6.   
  7. package com.cayden.thread731;  
  8.   
  9. import java.io.BufferedReader;  
  10. import java.io.BufferedWriter;  
  11. import java.io.IOException;  
  12. import java.io.PipedReader;  
  13. import java.io.PipedWriter;  
  14.   
  15. /** 
  16.  * @author 崔冉 
  17.  * @version 1.0.0 
  18.  * @desc 
  19.  */  
  20. public class CommunicationByPipeCharacters {  
  21.   
  22.     static PipedWriter pw=null;  
  23.     static PipedReader pr=null;  
  24.     static BufferedWriter bw=null;  
  25.     static BufferedReader br=null;  
  26.       
  27.       
  28.     /** 
  29.      * @param args 
  30.      * @throws IOException  
  31.      */  
  32.     public static void main(String[] args) throws IOException {  
  33.         // TODO Auto-generated method stub  
  34.         pw=new PipedWriter();  
  35.         pr=new PipedReader(pw);  
  36.         bw=new BufferedWriter(pw);  
  37.         br=new BufferedReader(pr);  
  38.           
  39.         Thread thread1=new Thread(){  
  40.             public void run(){  
  41.                 try {  
  42.                     bw.write("hello"0"hello".length());  
  43.                     bw.newLine();  
  44.                     bw.flush();  
  45.                 } catch (IOException e) {  
  46.                     // TODO Auto-generated catch block  
  47.                     e.printStackTrace();  
  48.                 }  
  49.             }  
  50.         };  
  51.         thread1.start();  
  52.           
  53.         Thread thread2=new Thread(){  
  54.             public void run(){  
  55.                   
  56.                 try {  
  57.                     System.out.println(br.readLine());  
  58.                 } catch (IOException e) {  
  59.                     // TODO Auto-generated catch block  
  60.                     e.printStackTrace();  
  61.                 }  
  62.                   
  63.             }  
  64.         };  
  65.         thread2.start();  
  66.     }  
  67.   
  68. }  

运行结果如下:

[java] view plaincopy
  1. hello  


0 0
原创粉丝点击