我们所掌握的线程通信手段还只限于主线程通过唤醒,中断机制向子线程发出信号,或者在通过创建子线程时候向构造方法传入数据,以及设置子线程的公有属性。但是仅凭这些事难以胜任要求的。
在多线程开发领域,线程与线程之间需要交换信息。这是一种普遍存在的需求。并不仅限于主线程和子线程之间。子线程和子线程之间也有可能需要交换信息。
线程之间能够方便的基于共享地址空间实现通信,这本身。便是多线程应用程序的一大优势,因为进程之间是不能互访对方的地址空间的。在进程之间传递信息只能采用类似于远程调用的手段。
本文主要讲在线程之间实现二进制信息和字符串的传输。
传递二进制信息
利用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();
}
}
分享到:
相关推荐
线程间的通信一般采用四种方式:全局变量方式、消息传递方式、参数传递方式和线程同步法。线程间通信最简单的一种方法是使用全局变量,这用的就是全局变量的方式。
线程间通信方式3:消息传递方式的演示。采用计算演示线程的执行,并采用用户界面线程来实时显示执行的进度,线程间的通信方式采用了3种方式相结合,对多线程间的通信有比较好的学习和研究价值。
采用的是C#的Winform开发,提供了两种线程交互的方式。 第一:在主线程中开启两个子线程,子线程用事件方式来进行通信。对于主线程的控件操作采用的是delegate委托的方式,避免主线程假死。 第二:采用的是...
该程序是我写的博客“一起talk C栗子吧(第一百一十一回:C语言实例--线程间通信)”的配套程序,共享给大家使用
线程间通信方式2:参数传递方式。通过3类线程的创建方法,演示了给线程传递方式的方式,包括;单参数、多参数和类3类。
文档详细介绍了Handler实现线程间通信过程中源码的实现机制,并对其中的Looper,MessageQueue,Message对象的初始化及sendMessage()通过sendMessageDelayed()和sendMessageAtTime()过程的操作机流程
Android线程间通信的Message机制Android线程间通信的Message机制Android线程间通信的Message机制Android线程间通信的Message机制Android线程间通信的Message机制
多进程和多线程是系统执行多任务机制的重要手段,多任务同时进行自然少不了相互之间的通信工作。下面先将线程间的通信方式总结一下,便于大家对比学习。
使用wait()和notify()实现的生产者与消费者模型,可以了解如何使用wait()和notify()进行线程间通信。(上一次上传的代码有一个问题没有考虑到,这次修补了——CSDN没法撤销资源,只能再上传了)
主要描述了android的线程间通信的原理和应用
先进软件测试技术线程间通信求和逆序源代码
Android界面利用线程间通信,同步更新时间。
关于Java线程间通信-回调
线程间通信.emmx
VC多线程例程七及图解文档(线程间通信) 含源源码
1.10 第三章进程线程间通信
多线程线程间通信,可用于控制线程内部函数,做处理......................................................
通过自定义Handler、Looper、Message.浅析Android线程间通信原理
android 线程间通信的介绍,非常实用。
[经典]linux线程编程-线程间通信(1).