`
jin8000608172
  • 浏览: 140069 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

线程间通信

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

}

分享到:
评论

相关推荐

    MFC线程间通信

    然而,当一个应用程序中有多个线程运行时,它们可能需要共享数据或协调工作,这就涉及到线程间通信(Inter-Thread Communication,简称ITC)。MFC(Microsoft Foundation Classes)库,作为Windows平台上C++开发的...

    线程间通信方式3:消息传递方式

    在多线程编程中,线程间通信是一个关键的概念,用于协调不同线程之间的操作,确保数据的一致性和正确性。本示例“线程间通信方式3:消息传递方式”着重介绍了通过消息传递实现线程间的通信。下面将详细阐述这种通信...

    VC多线程例程七及图解文档(线程间通信)

    本文将深入探讨“VC多线程例程七”,重点介绍线程间通信这一关键概念,并结合源码分析,以MultiThread7项目为例进行详细讲解。 线程是操作系统分配CPU时间的基本单位,一个进程中可以有多个线程并行运行。在VC++中...

    线程间通信的定义及全局变量的方法

    本文将重点探讨线程间的通信方式,特别是通过全局变量进行线程间通信的方法以及为了解决数据竞争问题而引入的同步和互斥机制。 首先,线程间通信指的是在同一个进程中的多个线程之间交换信息或数据的过程。由于线程...

    线程间通信方式2:参数传递方式

    本文将详细探讨“线程间通信方式2:参数传递方式”,并通过对不同创建线程方法的分析,展示如何有效地传递参数。 1. **线程创建方法** 在Windows API中,我们通常使用以下三种方法创建线程: - **CreateThread...

    C#线程间通信

    采用的是C#的Winform开发,提供了两种线程交互的方式。 第一:在主线程中开启两个子线程,子线程用事件方式来进行通信。对于主线程的控件操作采用的是delegate委托的方式,避免主线程假死。 第二:采用的是...

    Windows 2000线程间通信

    【Windows 2000线程间通信】是操作系统中的一种机制,允许同一进程或不同进程的线程之间进行信息交换。这一通信机制基于Windows 2000提供的内核对象,包括文件、文件映射、邮件槽和命名管道等多种方式。其中,文件和...

    C例子:线程间通信

    该程序是我写的博客“一起talk C栗子吧(第一百一十一回:C语言实例--线程间通信)”的配套程序,共享给大家使用

    Qt线程之间通信、线程和进程之间通信实例

    本实例将深入探讨Qt如何实现线程间通信以及线程与进程间通信,并提供简单易懂的代码示例。 一、Qt线程间通信 Qt通过信号和槽机制,使得线程间的通信变得直观且易于理解。信号是对象状态变化的通知,而槽是响应这些...

    Handler实现线程间通信机制的原理

    文档详细介绍了Handler实现线程间通信过程中源码的实现机制,并对其中的Looper,MessageQueue,Message对象的初始化及sendMessage()通过sendMessageDelayed()和sendMessageAtTime()过程的操作机流程

    android 线程间通信

    ### Android线程间通信详解 #### 一、引言 Android应用程序通常运行在单个主线程上,称为“主线程”或“UI线程”。为了提高应用性能和用户体验,开发者经常需要利用多线程技术来执行后台任务,比如下载图片、获取...

    Android线程间通信的Message机制

    Android线程间通信的Message机制Android线程间通信的Message机制Android线程间通信的Message机制Android线程间通信的Message机制Android线程间通信的Message机制

    android 线程间通信显示同步时间

    在Android应用开发中,线程间通信是必不可少的技能,特别是在涉及到UI更新和后台任务执行时。本主题将深入探讨如何在Android中实现线程间通信,并以显示同步时间为例,展示具体的操作流程。 首先,Android系统是...

    线程间通信求和逆序源代码

    在IT行业中,线程间通信(Inter-Thread Communication, ITC)是多线程编程中的一个关键概念。当一个程序包含多个并发执行的线程时,线程间通信用于协调它们之间的活动,确保数据的一致性和正确性。在这个场景中,...

    Qt线程间通信,线程控制界面显示

    本文将深入探讨“Qt线程间通信,线程控制界面显示”这一主题。 首先,理解Qt中的线程模型是非常重要的。Qt采用的是QThread类来实现线程管理。每个QThread对象代表一个操作系统级别的线程,通过继承QThread或者使用...

    关于Java线程间通信-回调.docx

    在Java编程中,线程间通信(Inter-Thread Communication,简称ITC)是并发编程中的一个重要概念,它涉及到如何在不同线程之间有效地共享数据和协调执行。在Java中,线程间通信主要通过多种机制实现,其中包括回调...

    创建线程及线程间通信

    接下来,我们关注线程间通信。线程通信是线程协作完成任务的关键,它允许线程之间交换数据或同步操作。一种常见的通信机制是“生产者-消费者”模型,其中生产者线程生成数据,而消费者线程消费这些数据。在没有适当...

    Android中线程间通信.pdf

    ### Android中线程间通信详解 #### 一、引言 在Android开发中,线程间的通信是一项重要的技术。为了确保应用的响应性和流畅性,开发者必须了解如何正确地管理和同步多个线程之间的数据交换。本文将深入探讨Android...

    多线程之间的线程通信

    4. **管道(Pipe)**和**套接字(Socket)**:这些是进程间通信(IPC)的方法,也可以用于线程间通信。例如,在服务器-客户端模型中,通过套接字进行通信,线程可以在同一进程中模拟网络通信,从而更好地理解线程通信的...

    自定义Handler-Looper实现线程间通信

    在Android开发中,线程间通信是一个至关重要的概念,它涉及到多线程处理以及UI更新。Handler、Looper和Message是Android系统提供的一套用于在不同线程之间传递消息和进行同步的关键组件。本文将深入探讨如何自定义...

Global site tag (gtag.js) - Google Analytics