java io PipedInputStream源码分析

目录

简介

字段closedByWriter,closedByReader,connected,readSide,writeSide,buffer,in,out

4个构造函数,方法initPipe,connected

2个receive方法,checkStateForReceive方法,awaitSpace方法,receivedLast方法

2个read方法,available方法,close方法


简介


package java.io;

/**
 * 管道输入流应该连接到管道输出流;
 * 然后,管道输入流提供写入管道输出流的字节数据。
 * 通常,一个线程从PipedInputStream对象中读取数据,其他线程将数据写入相应的PipedOutputStream中。
 * 不建议在单个线程中同时使用这两个对象,因为它可能导致线程死锁。
 * 管道输入流包含一个缓冲区,在一定范围内解耦读操作和写操作。
 * 如果向连接的管道输出流提供数据字节的线程不再是活动的,那么管道被破坏。
 *
 * @author  James Gosling
 * @see     java.io.PipedOutputStream
 * @since   JDK1.0
 */
public class PipedInputStream extends InputStream 

字段closedByWriter,closedByReader,connected,readSide,writeSide,buffer,in,out

	// 3个标志,closedByReader是volatile的
    boolean closedByWriter = false;
    volatile boolean closedByReader = false;
    boolean connected = false;

    /* 提醒:读写侧的识别需要更加复杂。
    要么使用线程组(但是线程中的管道呢?),要么使用终结(但是到下一次GC可能需要很长时间)。
     */
    // 读和写 的线程
    Thread readSide;
    Thread writeSide;

    private static final int DEFAULT_PIPE_SIZE = 1024;

    /**
     * 管道的循环输入缓冲区的默认大小。1024
     * @since   JDK1.1
     */
    // 在允许更改管道大小之前,这是一个常量。为了向后兼容性,将继续维护该字段。
    protected static final int PIPE_SIZE = DEFAULT_PIPE_SIZE;

    /**
     * 用于存放传入数据的循环缓冲区。
     * @since   JDK1.1
     */
    protected byte buffer[];

    /**
     * 从连接管道输出流接收到的下一个数据字节将存储在循环缓冲区中位置的索引。
     * in<0表示缓冲区为空,in==out表示缓冲区已满
     * @since   JDK1.1
     */
    protected int in = -1;

    /**
     * 循环缓冲区中位置的索引,数据的下一个字节将在该位置被
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值