从PipedInputStream读取数据时,如果符合下面三个条件,就会出现IOException异常:
1. 试图从PipedInputStream读取数据,
2. PipedInputStream的缓冲区为“空”(即不存在可读取的数据),
3. 最后一个向PipedOutputStream写数据的线程不再活动(通过Thread.isAlive()检测)。
这是一个很微妙的时刻,同时也是一个极其重要的时刻。假定有一个线程w向PipedOutputStream写入数据;另一个线程r从对应的 PipedInputStream读取数据。下面一系列的事件将导致r线程在试图读取PipedInputStream时遇到IOException异常:
1. w向PipedOutputStream写入数据。
2. w结束(w.isAlive()返回false)。
3. r从PipedInputStream读取w写入的数据,清空PipedInputStream的缓冲区。
4. r试图再次从PipedInputStream读取数据。这时PipedInputStream的缓冲区已经为空,而且w已经结束,从而导致在读操作执行时出现IOException异常。
构造一个程序示范这个问题并不困难,只需从Listing 3的startWriterThread()方法中,删除while(true)条件。这个改动阻止了执行写操作的方法循环执行,使得执行写操作的方法在一次写入操作之后就结束运行。如前所述,此时主线程试图读取PipedInputStraem时,就会遇到一个IOException异常。
文章来源于领测软件测试网 https://www.ltesting.net/