线程间通信

阅读更多
我们所掌握的线程通信手段还只限于主线程通过唤醒,中断机制向子线程发出信号,或者在通过创建子线程时候向构造方法传入数据,以及设置子线程的公有属性。但是仅凭这些事难以胜任要求的。
在多线程开发领域,线程与线程之间需要交换信息。这是一种普遍存在的需求。并不仅限于主线程和子线程之间。子线程和子线程之间也有可能需要交换信息。
线程之间能够方便的基于共享地址空间实现通信,这本身。便是多线程应用程序的一大优势,因为进程之间是不能互访对方的地址空间的。在进程之间传递信息只能采用类似于远程调用的手段。
本文主要讲在线程之间实现二进制信息和字符串的传输。
传递二进制信息
利用java.io.PipedOutputStream和java.io.PipedInputStream可以实现线程之间的二进制信息传输。PipedOutputStream是OutputStream直接子类,而.PipedInputStream是InputStream直接子类。
与OutputStream和InputStream的重要区别在于:PipedOutputStream拥有一个允许指定输入管道流的构造方法,而PipedInputStream拥有一个允许指定输出管道流的构造方法。
下面例子就是线程之间二进制信息传递
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在线程之间传输字符信息。与上文的类似。
下面给出一个例子
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();
				}
			}
		};
		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,线程间的通信,线程,字符,二进制)