目录
字段closedByWriter,closedByReader,connected,readSide,writeSide,buffer,in,out
2个receive方法,checkStateForReceive方法,awaitSpace方法,receivedLast方法
简介
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;
/**
* 循环缓冲区中位置的索引,数据的下一个字节将在该位置被