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利用率的同时还会使程序员对各 ...
随机推荐
- POJO,JavaBean,entity的理解
POJO本质是就是JavaBean JavaBean JavaBean实际上是指一种特殊的Java类,它通常用来实现一些比较常用的简单功能,并可以很容易的被重用或者是插入其他应用程序中去.所有遵循“一 ...
- UVA - 1451 Average (斜率优化)
题意:由01组成的长度为n的子串,AT由0表示,GC由1表示,求一段长度大于等于L且GC率最高的子串的起始终止坐标,若GC率相同,取长度较小,若长度相同,取起始坐标最小. 分析: 1.一个子串(i+1 ...
- HYSBZ - 1588 营业额统计 (伸展树)
题意:营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额.分析营 ...
- 统计返回的Decimal/long型数据转换问题
mysql数据库在进行统计时候,返回的count()是个long型,sum()返回的是bigDecimal类型,前段需要的是int型故而需要进行转换. <select id="getD ...
- 055-for循环中break的使用
<?php ;;$x++){ //省略表达式2的for循环将是无限循环 echo "$x<br />"; ){ break; //使用if语句控制退出无限循环 } ...
- VMware虚拟机黑屏
引用自:VMware吧 近期很多朋友遇到了VMware Workstation 14开启或新建虚拟机后黑屏的现象,无法关机,软件也无法关闭 用任务管理器结束VMware后这个VMX进程也关不了 解决办 ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-flag
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...
- 尝试用kotlin做一个app(五)
JSP后台管理系统 开发工具是IntelliJ IDEA+tomcat+mysql5.6.19+mysql-connector-java-5.1.48.jar+easyui+kindeditor 之前 ...
- NVIDIA TX2--3--NVIDIA Jetson TX2 查看系统版本参数状态及重要指令
NVIDIA Jetson TX2 查看系统参数状态. 当前博主的TX2更新的版本为:Jetpack 3.3, cuda 9.0.252, cudnn7.0, opencv3.3.1, TensorR ...
- DW1000芯片定位技术解析
近些年来随着物联网和机器人技术的大发展,精确定位技术的热度也随之攀升.目前精确定位的技术有很多,如基于wifi.RFID.zigbee.超声波.UWB等技术都可以实现精准定位.由于技术的不同,精度也不 ...