前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >NIO系列(六)——线程通信(pipe)

NIO系列(六)——线程通信(pipe)

作者头像
逝兮诚
发布2019-10-30 13:40:47
5360
发布2019-10-30 13:40:47
举报
文章被收录于专栏:代码人生

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/luo4105/article/details/73650562

Pipe

Pipe用于线程之间的数据传输。Pipe有两个嵌套类(内部类)SinkChannel和SourceChannel,数据写入到SinkChannel,数据从SourceChannel读取。

创建Pipe

通过Pipe.open()来创建管道

代码语言:javascript
复制
Pipe pipe = Pipe.open();

向管道写入数据

创建SinkChannel对象

代码语言:javascript
复制
Pipe.SinkChannel sink = pipe.sink();

调用SinkChannel的write()方法,向SinkChannel写入数据,就像这样

代码语言:javascript
复制
String writeData = "threadA";
System.out.println("线程A输入数据:" + writeData);
ByteBuffer byteBuffer =ByteBuffer.allocate(64);
byteBuffer.put(writeData.getBytes("UTF-8"));
byteBuffer.flip();
while (byteBuffer.hasRemaining()) {
    sink.write(byteBuffer);
}
byteBuffer.clear();
sink.close();

从管道读出数据

创建SourceChannel对象

代码语言:javascript
复制
Pipe.SourceChannel source = pipe.source();

调用SourceChannel的read()方法读取数据,就像这样

代码语言:javascript
复制
ByteBuffer byteBuffer = ByteBuffer.allocate(64);
    int readSize = source.read(byteBuffer);
    byteBuffer.flip();
    while (readSize != -1) {
       System.out.println(Charset.forName("UTF-8").decode(byteBuffer));
       byteBuffer.clear();
       readSize = source.read(byteBuffer);
    }
source.close();

例子

这个简单的例子实现了线程A传数据到线程B的过程,运行main函数就可以。

代码语言:javascript
复制
public staticvoidmain(String[] args){
    try {
       Pipepipe= Pipe.open();
       Pipe.SinkChannelsink= pipe.sink();
       Pipe.SourceChannelsource= pipe.source();
       ThreadthreadA= newThread() {
           public void run() {
              StringwriteData= "threadA";
              System.out.println("线程A输入数据:" + writeData);
              ByteBufferbyteBuffer= ByteBuffer.allocate(64);
              try {
                  byteBuffer.put(writeData.getBytes("UTF-8"));
                  byteBuffer.flip();
                  while (byteBuffer.hasRemaining()) {
                     sink.write(byteBuffer);
                  }
                  byteBuffer.clear();
                  sink.close();
              }catch(UnsupportedEncodingException e) {
                  e.printStackTrace();
              }catch(IOException e) {
                  e.printStackTrace();
              }
           }
       };
       ThreadthreadB= newThread() {
           public void run() {
              ByteBufferbyteBuffer= ByteBuffer.allocate(64);
              try {
                  int readSize = source.read(byteBuffer);
                  byteBuffer.flip();
                  while (readSize != -1) {
                     System.out.println(Charset.forName("UTF-8").decode(byteBuffer));
                     byteBuffer.clear();
                     readSize = source.read(byteBuffer);
                  }
                  source.close();
              }catch(UnsupportedEncodingException e) {
                  e.printStackTrace();
              }catch(IOException e) {
                  e.printStackTrace();
              }
           }
       };
       threadA.start();
       threadB.start();
    }catch(IOException e) {
       e.printStackTrace();
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017/06/23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Pipe
    • 创建Pipe
      • 向管道写入数据
        • 从管道读出数据
          • 例子
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档