Thread--线程间通信--管道
在Java语言中提供了各种各样的输入/输出流Stream,使我们能够方便的对数据进行操作,其中管道流是一种特殊的流,用于在不同线程间直接传送数据。一个线程发送数据到输出管道,另一个线程从输入管道中读数据。通过使用管道,实现不同线程间的通信,而无须借助于类似临时文件之类的东西。
在Java的JDK中提供了4个类来使线程间可以进行通信:
1)PipedInputStream和PipedOutputStream
2)PipedReader和PipedWriter
1)PipedInputStream和PipedOutputStream
package pipeInputOutput;
import java.io.PipedOutputStream;
public class WriteData {
public void writeMethod(PipedOutputStream out) {
try {
System.out.println("write :");
for(int i=0; i<30000; i++) {
String outData = "" + (i+1);
out.write(outData.getBytes());
System.out.print(outData);
}
System.out.println();
out.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
package pipeInputOutput;
import java.io.PipedInputStream;
public class ReadData {
public void readMethod(PipedInputStream in) {
try {
byte[] byteArray = new byte[20];
int readLength = in.read(byteArray);
while(readLength != -1) {
System.out.print("read :");
String newData = new String(byteArray, 0, readLength);
System.out.println(newData);
readLength = in.read(byteArray);
}
System.out.println();
in.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
package pipeInputOutput;
import java.io.PipedOutputStream;
public class ThreadWrite extends Thread {
private WriteData write;
private PipedOutputStream out;
public ThreadWrite(WriteData write, PipedOutputStream out) {
super();
this.write = write;
this.out = out;
}
@Override
public void run() {
write.writeMethod(out);
}
}
package pipeInputOutput;
import java.io.PipedInputStream;
public class ThreadRead extends Thread {
private ReadData read;
private PipedInputStream in;
public ThreadRead(ReadData read, PipedInputStream in) {
super();
this.read = read;
this.in = in;
}
@Override
public void run() {
read.readMethod(in);
}
}
package pipeInputOutput; import java.io.PipedInputStream;
import java.io.PipedOutputStream; public class Run { public static void main(String[] args) {
try {
WriteData writeData = new WriteData();
ReadData readData = new ReadData(); PipedInputStream inputStream = new PipedInputStream();
PipedOutputStream outputStream = new PipedOutputStream(); outputStream.connect(inputStream); // outputStream.write("hello world".getBytes());
// byte[] bs = new byte[100];
// int i = inputStream.read(bs);
// System.out.println(new String(bs,0,i)); ThreadRead threadRead = new ThreadRead(readData, inputStream);
threadRead.start(); Thread.sleep(2000); ThreadWrite threadWrite = new ThreadWrite(writeData, outputStream);
threadWrite.start();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
} }
2)PipedReader和PipedWriter
package pipeReaderWriter;
import java.io.PipedWriter;
public class WriteData {
public void writeMethod(PipedWriter out) {
try {
System.out.println("write :");
for(int i=0; i<300; i++) {
String outData = "" + (i+1);
out.write(outData);
System.out.println(outData);
}
System.out.println();
out.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
package pipeReaderWriter;
import java.io.PipedReader;
public class ReadData {
public void readMethod(PipedReader in) {
try {
System.out.println("read:");
char[] byteArray = new char[20];
int readLength = in.read(byteArray);
while(readLength != -1) {
String newData = new String(byteArray, 0, readLength);
System.out.println(newData);
readLength = in.read(byteArray);
}
System.out.println();
in.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
package pipeReaderWriter;
import java.io.PipedWriter;
public class ThreadWrite extends Thread {
private WriteData write;
private PipedWriter out;
public ThreadWrite(WriteData write, PipedWriter out) {
super();
this.write = write;
this.out = out;
}
@Override
public void run() {
write.writeMethod(out);
}
}
package pipeReaderWriter;
import java.io.PipedReader;
public class ThreadRead extends Thread {
private ReadData read;
private PipedReader in;
public ThreadRead(ReadData read, PipedReader in) {
super();
this.read = read;
this.in = in;
}
@Override
public void run() {
read.readMethod(in);
}
}
package pipeReaderWriter; import java.io.PipedReader;
import java.io.PipedWriter; public class Run { public static void main(String[] args) {
try {
WriteData writeData = new WriteData();
ReadData readData = new ReadData(); PipedWriter out = new PipedWriter();
PipedReader in = new PipedReader(); in.connect(out); ThreadRead threadRead = new ThreadRead(readData, in);
threadRead.start(); Thread.sleep(2000); ThreadWrite threadWrite = new ThreadWrite(writeData, out);
threadWrite.start(); } catch (Exception e) {
// TODO: handle exception
}
} }
Thread--线程间通信--管道的更多相关文章
- Java多线程编程核心技术---线程间通信(二)
通过管道进行线程间通信:字节流 Java提供了各种各样的输入/输出流Stream可以很方便地对数据进行操作,其中管道流(pipeStream)是一种特殊的流,用于在不同线程间直接传送数据,一个线程发送 ...
- Java多线程学习(五)线程间通信知识点补充
系列文章传送门: Java多线程学习(二)synchronized关键字(1) Java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Java多 ...
- linux高级编程基础系列:线程间通信
linux高级编程基础系列:线程间通信 转载:原文地址http://blog.163.com/jimking_2010/blog/static/1716015352013102510748824/ 线 ...
- java并发之线程间通信协作
在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界 ...
- Java多线程编程(三)线程间通信
线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一,可以说,使线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时 ...
- Java多线程编程核心技术-第3章-线程间通信-读书笔记
第 3 章 线程间通信 线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一,可以说,使线程间进行通信后,系统之间的交互性会更强大,在大 ...
- Java多线程编程(6)--线程间通信(下)
因为本文的内容大部分是以生产者/消费者模式来进行讲解和举例的,所以在开始学习本文介绍的几种线程间的通信方式之前,我们先来熟悉一下生产者/消费者模式. 在实际的软件开发过程中,经常会碰到如下场景 ...
- java多线程:线程间通信——生产者消费者模型
一.背景 && 定义 多线程环境下,只要有并发问题,就要保证数据的安全性,一般指的是通过 synchronized 来进行同步. 另一个问题是,多个线程之间如何协作呢? 我们看一个仓库 ...
- 0038 Java学习笔记-多线程-传统线程间通信、Condition、阻塞队列、《疯狂Java讲义 第三版》进程间通信示例代码存在的一个问题
调用同步锁的wait().notify().notifyAll()进行线程通信 看这个经典的存取款问题,要求两个线程存款,两个线程取款,账户里有余额的时候只能取款,没余额的时候只能存款,存取款金额相同 ...
- Java多线程编程核心技术---线程间通信(一)
线程是操作系统中独立的个体,但这些个体如果不经过特殊处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一.线程间通信可以使系统之间的交互性更强大,在大大提高CPU利用率的同时还会使程序员对各 ...
随机推荐
- NO11 SSH故障排查思路和netstat命令
本章知识相关考试:1.企业场景面试题:Linux系统如何优化?2.企业场景面试题:SSH服务连不上,如何排查?记住回答技巧: 1 ping 2 telnet 客户端ssh工具:SecureCRT,x ...
- MongoDB_01
解释:MongoDB可应对 --三高需求 High performance-对数据库高并发读写的需求 Huge Storage -对海量数据的高效率存储和访问的需求 High Scalability ...
- P1006 换个格式输出整数
这道题相较于上一题来说就简单了许多.看题. 怎么感觉这道题有点类似P1002写出这个数.流程差不多,思路大致是先求出每一位上的数,然后根据 百十个 的顺序输出结果.题目比较简单,不做赘述,贴代码 代码 ...
- UVA - 1346 Songs (贪心+排序)
题意:已知每首歌的标号,长度和播放频率,求一种播放顺序,使得最小,并且输出该播放顺序下第t首歌的标号. 分析: 1.长度越短,播放频率越大的歌排在前面,上式越小. 2.s(i)表示的是当前播放顺序下这 ...
- NAND厂商哭晕:减产也阻止不了跌价
导读 NAND闪存价格已经连跌了6个季度,这让上游NAND厂商三星.东芝.美光等损失惨重,纷纷削减NAND产能.在群联台北电脑展上,群联公司董事长潘建成也预测NAND闪存价格已经跌破了成本,未来跌幅会 ...
- C++面试常见问题——09static关键字
static关键字 局部变量 局部变量 局部变量是最常见的量,编译器不会对其进行初始化,除非对其显式赋值,不然初始值是随机的. 普通局部变量存储在栈空间,使用完毕后会立即被释放. 静态局部变量 静态局 ...
- 7 —— node —— 响应图片
const http = require('http'); const fs = require('fs'); const server = http.createServer(); server ...
- Java扫雷游戏: JMine
JMine是用Java和Swing编写的扫雷程序.作者是Jerry Shen(火鸟),代码有一定年头了,最开始是作者的课程设计.阅读这种小程序对编程语言的学习挺有帮助.本文只简单介绍一些关键的地方,实 ...
- 一百零二、SAP中ALV事件之十五,让ALV表格自动求和
一.代码如下 二.运行之后,效果如图,表头多了一个求和符号E,最下面一行会列出求和的相关信息 完美
- C#的listview
listView1.Items.Clear(); ListViewItem listitem = new ListViewItem(字符串);//这是第一列的内容,需要,而且必须通过构造方法添加 ; ...