通过管道进行线程间通信:字节流。字符流的用法及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中,我们已经详细的了 ...
随机推荐
- Android SQLite 数据库 增删改查操作
Android SQLite 数据库 增删改查操作 转载▼ 一.使用嵌入式关系型SQLite数据库存储数据 在Android平台上,集成了一个嵌入式关系型数据库--SQLite,SQLite3支持NU ...
- linux经常使用解压缩命令
1.tar.gz 解压 tar -zxvf source.tar.gz 压缩 tar -zcvf target.tar.gz source1 source2 2.bz2 解压 tar -jxvf so ...
- [2014 Regional]牡丹江 H Hierarchical Notation 做题记录
主妇:老年人谁是炮灰牡丹江,我们的团队只是做同步大赛 他决定开爆震H什么时候,A 5min 1Y.I在该限制后,纠结了很久30min+ 1Y,神继续承担各种位置卡D在,hpp见B我认为这是非常熟悉的研 ...
- UDP议定书图像高速传输无损失程序
下面的程序实现UDP没有图像数据的高速传输协议损耗,测试数据egtest01图片库,实现PC和图像的传输嵌入式结束.变速箱+读写速度可以达到10+M/S.考 server端程序 #include &l ...
- js匀速运动停止条件
匀速运动,怎么让它到达指定位置时停止呢? 原理: 1,物体和目标的差值距离小于等于速度时,即停止 2,接着让物体移动位置等于目标位置 示例:匀速运动停止 html部分 <input type=& ...
- JS学习笔记-OO疑问之封装
封装是面向对象的基础,今天所要学习的匿名函数与闭包就是为了实现JS的面向对象封装.封装实现.封装变量,提高数据.系统安全性,封装正是面向对象的基础. 一.匿名函数 即没有名字的函数,其创建方式为 fu ...
- java ClassLoader static
package init; class Person { private static Person person = new Person(); public static int count2 = ...
- 【转】java JTable排序和过滤
JTable排序 在Java SE 6中除了java.awt被更新外,javax.swing同时也有了很大的改进.在C/S程序中我们会经常使 用到"表".如我们可以在查询数据库后将 ...
- 【SQL】Oracle的PL/SQL语法及其拓展数据类型总结
PL/SQL语法 PL/SQL程序由三部分组成,声明部分.执行部分.异常处理部分. 模板: DECLARE /*变量声明*/ BEGIN /*程序主体*/ EXCEPTION /*异常处理部分*/ E ...
- HDU 1061 Rightmost Digit解决问题的方法
求大量N^N的值最右边的数字,即最低位. 它将能够解决一个简单二分法. 只是要注意溢出,只要把N % 10之后.我不会溢出,代替使用的long long. #include <stdio.h&g ...