文档章节

线程通信-管道

清尘V
 清尘V
发布于 2016/05/16 14:12
字数 270
阅读 36
收藏 2

通过PipedInputStream和PipedOutputStream方式可以实现线程间通信

现在看具体例子:

package com.vincent.pipe;

import java.io.PipedOutputStream;

/**
 * Vincent 创建于 2016/5/13.
 */
public class Thread1 implements Runnable {

    private PipedOutputStream outputStream;

    public Thread1( PipedOutputStream outputStream) {
        this.outputStream = outputStream;
    }

    @Override
    public void run() {
        while (true) {
            try {
                Thread.sleep(5000);
                String s = String.valueOf(System.currentTimeMillis());
                byte[] bytes = s.getBytes();
                outputStream.write(bytes);
                System.out.println("写入数据:"+s);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}
package com.vincent.pipe;

import java.io.PipedInputStream;

/**
 * Vincent 创建于 2016/5/13.
 */
public class Thread2 implements Runnable {

    private PipedInputStream inputStream;

    public Thread2(PipedInputStream inputStream) {
        this.inputStream = inputStream;

    }

    @Override
    public void run() {

        try {
            int length = -1;
            byte[] bytes = new byte[1024];
            //read方法会阻塞线程
            while ((length = inputStream.read(bytes)) != -1) {
                System.out.println("读取数据:" + new String(bytes, 0, length));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
package com.vincent.pipe;

import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;

/**
 * Vincent 创建于 2016/5/13.
 */
public class Main {
    public static void main(String[] args) throws IOException {

        PipedOutputStream outputStream=new PipedOutputStream();
        PipedInputStream inputStream=new PipedInputStream();

        inputStream.connect(outputStream);

        Thread thread1=new Thread(new Thread1(outputStream));
        Thread thread2=new Thread(new Thread2(inputStream));
        thread1.start();
        thread2.start();
    }
}

输出:

写入数据:1463378999693
读取数据:1463378999693
写入数据:1463379004694
读取数据:1463379004694
写入数据:1463379009695
读取数据:1463379009695

通过以上例子,线程之间通过管道方式实现了通信

© 著作权归作者所有

共有 人打赏支持
上一篇: 设计模式之原则
下一篇: BIO和NIO效率对比
清尘V
粉丝 41
博文 107
码字总数 47780
作品 0
青岛
程序员
私信 提问
20.进程与线程通信方式之间的差异

进程线程通信方式之间的差异 每个进程有自己的地址空间。两个进程中的地址即使值相同,实际指向的位置也不同。进程间通信一般通过操作系统的公共区进行。 同一进程中的线程因属同一地址空间,...

u014590757
04/16
0
0
Linux 的 进程/线程 通信方式总结

linux系统中的进程通信方式主要以下几种: PIPE(FIFO) 消息队列 信号量(Semaphore) 共享存储 SOCKET 同一主机上的进程通信方式 UNIX进程间通信方式: 包括管道(PIPE), 有名管道(FIFO), 和信号(...

大数据之路
2012/10/05
0
0
Java IO类库之管道流PipeInputStream与PipeOutputStream

一、java管道流介绍 在java多线程通信中管道通信是一种重要的通信方式,在java中我们通过配套使用管道输出流PipedOutputStream和管道输入流PipedInputStream完成线程间通信。多线程管道通信的...

老韭菜
07/23
0
1
进程间通信的方式及比较

进程间通信就是在不同进程之间传播或交换信息,那么不同进程之间存在着什么双方都可以访问的介质呢?进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是共享内存区。但是,...

willis_sun
2017/03/31
0
0
进程间、线程间通信方式

一、进程间的通信方式 (1)管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。 (2)有名管道 (nam...

为了美好的明天
02/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

RestClientUtil和ConfigRestClientUtil区别说明

RestClientUtil directly executes the DSL defined in the code. ConfigRestClientUtil gets the DSL defined in the configuration file by the DSL name and executes it. RestClientUtil......

bboss
59分钟前
11
0

中国龙-扬科
昨天
2
0
Linux系统设置全局的默认网络代理

更改全局配置文件/etc/profile all_proxy="all_proxy=socks://rahowviahva.ml:80/"ftp_proxy="ftp_proxy=http://rahowviahva.ml:80/"http_proxy="http_proxy=http://rahowviahva.ml:80/"......

临江仙卜算子
昨天
9
0
java框架学习日志-6(bean作用域和自动装配)

本章补充bean的作用域和自动装配 bean作用域 之前提到可以用scope来设置单例模式 <bean id="type" class="cn.dota2.tpye.Type" scope="singleton"></bean> 除此之外还有几种用法 singleton:......

白话
昨天
8
0
在PC上测试移动端网站和模拟手机浏览器的5大方法

总结很全面,保存下来以备不时之需。原文地址:https://www.cnblogs.com/coolfeng/p/4708942.html

kitty1116
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部