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利用率的同时还会使程序员对各 ...
随机推荐
- UVA - 816 Abbott's Revenge(bfs)
题意:迷宫从起点走到终点,进入某点的朝向不同,可以出去的方向也不同,输出最短路. 分析:因为朝向决定接下来在该点可以往哪里走,所以每个点需要有三个信息:x,y,d(坐标和进入该点的朝向),所以将起点的 ...
- ExcelPackage导入导出,命名空间一定要是EPPlus
1.引入EPPlus.dll,旧版的是OfficeOpenXml.dll,最好使用EPPlus2.调用 string path = UploadExecl(batchUpload.BinaryExce ...
- [洛谷Luogu]P1803 线段覆盖问题
贪心想法题解的各位dalaodalaodalao都讲得很清楚了,在下就提供一种桶排的做法吧. 因为给出数据范围 0≤ai<bi≤10000000≤ai<bi≤10000000≤ai< ...
- 157-PHP strrchr函数输出最后一次出现字母p的位置到字符串结尾的所有字符串
<?php $str='PHP is a very good programming language!'; //定义一个字符串 echo strrchr($str,'o'); //输出最后一次 ...
- FindWindowXG
测试: 函数代码: function FindWindowXG(strClass, strTitle: string): THandle; var hd: THandle; arrClass: ..] ...
- 换根dp
感觉这类问题很少?算了,还是拿出来水一下吧qwq... 首先来看一道例题:POJ3585 一句话题意:树上任意源点多汇点最大流 你看这不就是个最大流的板子题吗?我先建个图,然后跑最大流,然后,,,然后 ...
- tkinter中控件menu的两种组织方法
tkinter中,菜单控件组织方法有两种,使用中常出现混淆,为明晰各个正确用法,特整理撰写此博文.菜单控件的组织实际上是通过一个“母菜单”和“子菜单”构成,“母菜单”一方面与master连接(即与依附 ...
- 逆向-PE头解析
目录 PE头解析 数据结构 IMAGE_DOS_HEADER IMAGE_NT_HEADERS 区块 PE头解析 PE 格式是Windows系统下组织可执行文件的格式.PE文件由文件头和对应的数据组成 ...
- UVA - 12107 Digit Puzzle(数字谜)(IDA*)
题意:给出一个数字谜,要求修改尽量少的数,使修改后的数字谜只有唯一解.空格和数字可以随意替换,但不能增删,数字谜中所有涉及的数必须是没有前导零的正数.输入数字谜一定形如a*b=c,其中a.b.c分别最 ...
- 解决CGrIdCtrl合并单元格后继续拆分后的问题
DWORD dwMergeCellCount = vMergeCells.size(); ; i < dwMergeCellCount; i++){ m_HFlexGrid.SplitCells ...