通过管道进行线程间通信:字节流。字符流的用法及API类似
管道流(PipedStream)可以用于不同线程间直接传送数据。
一个线程发送数据到输出管道,另一个线程从输入管道中读取数据。通过使用管道,实现不同线程间的通信,而无须借助于类似临时文件之类的东西。
package thread.communicate; import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream; /*2015-11-19*/
public class CommunicateWithPipedStream {
public static void main(String[] args) {
try {
PipedOutputStream out = new PipedOutputStream();
DataWriter writer = new DataWriter(out);
PipedInputStream in = new PipedInputStream();
DataReader reader = new DataReader(in);
// out.connect(in);
in.connect(out);
new Thread(writer, "Writer").start();
new Thread(reader, "Reader").start();
} catch (Exception e) {
e.printStackTrace();
} }
} class DataWriter implements Runnable {
private PipedOutputStream _out; public DataWriter(PipedOutputStream out) {
super();
this._out = out;
} @Override
public void run() {
write();
} public void write() {
System.out.println(Thread.currentThread() + "Start write....");
try {
for (int i = 0; i < 20; i++) {
String outStr = "" + (i + 1);
System.out.println(Thread.currentThread() + outStr);
_out.write(outStr.getBytes());
}
_out.close(); } catch (IOException e) {
e.printStackTrace();
} } } class DataReader implements Runnable { private PipedInputStream _in; public DataReader(PipedInputStream in) {
_in = in;
} @Override
public void run() {
read();
} public void read() {
try {
System.out.println(Thread.currentThread() + "Start read....");
byte[] byteArray = new byte[20];
int readLength = _in.read(byteArray);
while (readLength != -1) {
String newData = new String(byteArray, 0, readLength);
System.out.println(Thread.currentThread() + newData);
readLength = _in.read(byteArray);
}
System.out.println();
_in.close();
} catch (Exception e) {
e.printStackTrace();
}
} }
输出:
Thread[Writer,5,main]Start write....
Thread[Writer,5,main]1
Thread[Reader,5,main]Start read....
Thread[Writer,5,main]2
Thread[Reader,5,main]1
Thread[Reader,5,main]2
Thread[Writer,5,main]3
Thread[Writer,5,main]4
Thread[Writer,5,main]5
Thread[Writer,5,main]6
Thread[Writer,5,main]7
Thread[Writer,5,main]8
Thread[Writer,5,main]9
Thread[Writer,5,main]10
Thread[Writer,5,main]11
Thread[Writer,5,main]12
Thread[Writer,5,main]13
Thread[Writer,5,main]14
Thread[Writer,5,main]15
Thread[Writer,5,main]16
Thread[Writer,5,main]17
Thread[Writer,5,main]18
Thread[Writer,5,main]19
Thread[Writer,5,main]20
Thread[Reader,5,main]34567891011121314151
Thread[Reader,5,main]617181920
通过管道进行线程间通信:字节流。字符流的用法及API类似的更多相关文章
- java 利用管道实现线程间通信
package com.lb; import java.io.IOException;import java.io.PipedInputStream;import java.io.PipedOutpu ...
- Java多线程编程核心技术---线程间通信(二)
通过管道进行线程间通信:字节流 Java提供了各种各样的输入/输出流Stream可以很方便地对数据进行操作,其中管道流(pipeStream)是一种特殊的流,用于在不同线程间直接传送数据,一个线程发送 ...
- Java多线程编程(三)线程间通信
线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一,可以说,使线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时 ...
- Java多线程编程核心技术-第3章-线程间通信-读书笔记
第 3 章 线程间通信 线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一,可以说,使线程间进行通信后,系统之间的交互性会更强大,在大 ...
- 《JAVA多线程编程核心技术》 笔记:第三章:线程间通信
一. 等待/通知机制:wait()和notify()1.1.使用的原因:1.2 具体实现:wait()和notify()1.2.1 方法wait():1.2.2 方法notify():1.2.3 wa ...
- java并发之线程间通信协作
在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界 ...
- Java多线程编程(6)--线程间通信(下)
因为本文的内容大部分是以生产者/消费者模式来进行讲解和举例的,所以在开始学习本文介绍的几种线程间的通信方式之前,我们先来熟悉一下生产者/消费者模式. 在实际的软件开发过程中,经常会碰到如下场景 ...
- Java多线程学习(五)线程间通信知识点补充
系列文章传送门: Java多线程学习(二)synchronized关键字(1) Java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Java多 ...
- Java多线程:线程间通信之Lock
Java 5 之后,Java在内置关键字sychronized的基础上又增加了一个新的处理锁的方式,Lock类. 由于在Java线程间通信:volatile与sychronized中,我们已经详细的了 ...
随机推荐
- Windows 2008 配置ASP+ACCESS环境(亲身体会)
我们公司OA系统是用asp开发的,时间有些长了,原来只是公司总部,部署到内网就可以了,现在要求全国各地的分公司也要用,而且接入了56短网的短信接口(http://www.56dxw.com),主要起到 ...
- Cocos-2dx-Lua中使用Luaj的完整示例(转)
如何使用Luaj进行java与Lua之间的交互调用 一.主要分为两个大步骤,Lua工程的修改,android工程的修改 二.工程环境 开发工具:Cocos-Code-IDE Lua版本 : Lua 5 ...
- Android自己定义组件系列【9】——Canvas绘制折线图
有时候我们在项目中会遇到使用折线图等图形,Android的开源项目中为我们提供了非常多插件,可是非常多时候我们须要依据详细项目自己定义这些图表,这一篇文章我们一起来看看怎样在Android中使用Can ...
- UDP议定书图像高速传输无损失程序
下面的程序实现UDP没有图像数据的高速传输协议损耗,测试数据egtest01图片库,实现PC和图像的传输嵌入式结束.变速箱+读写速度可以达到10+M/S.考 server端程序 #include &l ...
- 谷歌技术面试要点(Google面试)(14年5月20日交大专场)
技术面试的主题 1.简要自我介绍: 姓名.学校.专业 做过的项目与实习 个人主要成就 2.技术评估: 构建与开发算法 编程 计算机基础知识 数据结构 现实世界问题解决能力 设计问题(主要针对博士生) ...
- Gmail POP3设定
好几个同事在问我怎样使用ThunderBird和OE收取IT CHT的邮箱,因为IT CHT就是用Gmail的功能,因此收发邮件是跟Gmail一样,下面是Gmail的POP&SMTP的设置方法 ...
- 高质量c c++编程
第1章 文件结构 每一个C++/C程序通常分为两个文件.一个文件用于保存程序的声明(declaration),称为头文件.还有一个文件用于保存程序的实现(implementation),称为定义(de ...
- C#取硬盘、CPU、主板、网卡的序号 ManagementObjectSearcher
原文:C#取硬盘.CPU.主板.网卡的序号 ManagementObjectSearcher private void button1_Click(object sender, EventArgs e ...
- 返璞归真 asp.net mvc (7) - asp.net mvc 3.0 新特性之 Controller
原文:返璞归真 asp.net mvc (7) - asp.net mvc 3.0 新特性之 Controller [索引页][源码下载] 返璞归真 asp.net mvc (7) - asp.net ...
- [ACM] poj 3468 A Simple Problem with Integers(段树,为段更新,懒惰的标志)
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 55273 ...