管道流(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类似的更多相关文章

  1. java 利用管道实现线程间通信

    package com.lb; import java.io.IOException;import java.io.PipedInputStream;import java.io.PipedOutpu ...

  2. Java多线程编程核心技术---线程间通信(二)

    通过管道进行线程间通信:字节流 Java提供了各种各样的输入/输出流Stream可以很方便地对数据进行操作,其中管道流(pipeStream)是一种特殊的流,用于在不同线程间直接传送数据,一个线程发送 ...

  3. Java多线程编程(三)线程间通信

    线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一,可以说,使线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时 ...

  4. Java多线程编程核心技术-第3章-线程间通信-读书笔记

    第 3 章 线程间通信 线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一,可以说,使线程间进行通信后,系统之间的交互性会更强大,在大 ...

  5. 《JAVA多线程编程核心技术》 笔记:第三章:线程间通信

    一. 等待/通知机制:wait()和notify()1.1.使用的原因:1.2 具体实现:wait()和notify()1.2.1 方法wait():1.2.2 方法notify():1.2.3 wa ...

  6. java并发之线程间通信协作

    在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界 ...

  7. Java多线程编程(6)--线程间通信(下)

      因为本文的内容大部分是以生产者/消费者模式来进行讲解和举例的,所以在开始学习本文介绍的几种线程间的通信方式之前,我们先来熟悉一下生产者/消费者模式.   在实际的软件开发过程中,经常会碰到如下场景 ...

  8. Java多线程学习(五)线程间通信知识点补充

    系列文章传送门: Java多线程学习(二)synchronized关键字(1) Java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Java多 ...

  9. Java多线程:线程间通信之Lock

    Java 5 之后,Java在内置关键字sychronized的基础上又增加了一个新的处理锁的方式,Lock类. 由于在Java线程间通信:volatile与sychronized中,我们已经详细的了 ...

随机推荐

  1. MySQL保留关键字

    今天在使用hibernate关联映射导出表的时候因为映射了一个表名为option,是MYSQL的关键字,总是生成错误,一开始以为是映射文件和代码问题,检查不出问题才想到可能用到数据库的保留关键字了,查 ...

  2. VMware vSphere 服务器虚拟化之十八桌面虚拟化之安装View Composer服务器

                        VMware vSphere 服务器虚拟化之十八桌面虚拟化之安装View Composer服务器      View Compose服务可安装在管理虚拟机的vC ...

  3. hdu1372 dfs搜索之国际象棋的马

    原题地址 题意 一个8x8的国际象棋棋盘,你有一个棋子"马".算出棋子"马"从某一格到还有一格子的最少步数. 与普通dfs不同的是,你能走的路线不是上下左右,四 ...

  4. Android RxJava使用介绍(三) RxJava的操作符

    上一篇文章已经具体解说了RxJava的创建型操作符.本片文章将继续解说RxJava操作符.包括: Transforming Observables(Observable的转换操作符) Filterin ...

  5. android最新的工具DateHelper

    最新的工具DateHelper 实用程序类,.的天数来获得一个给定的月份.过了几天去习惯或.周.一个月.日期等.. 代码例如以下: import android.annotation.Suppress ...

  6. WinCE CAB Manager 3.0学习

    VS自带智能设备打包工具,能实现打包.但是,打包安装部署之后,设备上面没有卸载,找了好多资料,最终都没有解决. WinCE CAB Manager3.0完美解决. 打包步骤如下, 一,打开WinCE ...

  7. Linux 下一个 Mysql error 2002 错误解决

    Linux 下一个 Mysql error 2002 错误解决     首先查看 /etc/rc.d/init.d/mysqld status 查看mysql它已开始.     假设启动的的话,先将数 ...

  8. CCProgressTo 和CCProgressTimer

    在cocos2d中相同提供了非常多表现图片和精灵的方式,上一篇其中提到的切换场景的方式之中的一个是顺或逆时针切入的方法,在图片上也能够使用,test里有一个样例介绍CCProgressTimer能够实 ...

  9. 使用shell/python获取hostname/fqdn释疑(转)

    一直以来被Linux的hostname和fqdn(Fully Qualified Domain Name)困惑了好久,今天专门抽时间把它们的使用细节弄清了. 一.设置hostname/fqdn 在Li ...

  10. Web层的搭建

    Web层的搭建 前言:好久没更新博客了,每天被该死的业务缠身,今天正好一个模块完成了,继续来完善我们的代码.之前的六篇完成了领域层.应用层.以及基础结构层的部分代码,这篇打算搭建下UI层的代码. DD ...