快速业务通道

彻底转变流,第2部分:优化Java内部I/O - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
final int DEFAULT_TIMEOUT_MS = 1000;   // flag indicates whether method applies to reader or writer   private static final boolean READER = false, WRITER = true;   // internal pipe buffer   private byte[] buffer;   // read/write index   private int readx, writex;   // pipe capacity, hysteresis level   private int capacity, level;   // flags   private boolean eof, closed, sleeping, nonBlocking;   // reader/writer thread   private Thread reader, writer;   // pending exception   private IOException exception;   // deadlock-breaking timeout   private int timeout = DEFAULT_TIMEOUT_MS;   public PipeInputStream () {    this (DEFAULT_BUFFER_SIZE, DEFAULT_HYSTERESIS);   }   public PipeInputStream (int bufferSize) {    this (bufferSize, DEFAULT_HYSTERESIS);   }   // e.g., hysteresis .75 means sleeping reader/writer is not   // immediately woken until the buffer is 75% full/empty   public PipeInputStream (int bufferSize, float hysteresis) {    if ((hysteresis < 0.0) || (hysteresis > 1.0))     throw new IllegalArgumentException ("Hysteresis: " + hysteresis);    capacity = bufferSize;    buffer = new byte[capacity];    level = (int) (bufferSize * hysteresis);   }

彻底转变流,第2部分:优化Java内部I/O(7)

时间:2011-06-21 Merlin Hughes

清单 9 中的配置方法允许您配置流的超时值和非阻塞模式。超时值的单位是 毫秒,它表示阻塞的线程在过了这段时间后将被自动唤醒;这对于打破在一个线 程死亡的情况下可能发生的死锁是必要的。在非阻塞模式中,如果线程阻塞,那 么 InterruptedIOException 将被抛出。

清单 9. 管道配置

public void setTimeout (int ms) {    this.timeout = ms;   }   public void setNonBlocking (boolean nonBlocking) {    this.nonBlocking = nonBlocking;   }

清单 10 中的读方法都遵循相当标准的模式:如果我们还没有读线程的引用 ,那么我们先取得它,然后我们验证输入参数,核对流未被关闭或没有异常待处 理,确定可以读取多少数据,最后把数据从内部的环缓冲区复制到读程序的缓冲 区。清单 12 中的 checkedAvailable() 方法在返回前自动地等待,直到出现一 些可用的数据或流被关闭。

清单 10. 读数据

private byte[] one = new byte[1];   public int read () throws IOException {    // read 1 byte    int amount = read (one, 0, 1);    // return EOF / the byte    return (amount < 0) ? -1 : one[0] & 0xff;   }   public synchronized int read (byte data[], int offset, int length)     throws IOException {    // take a reference to the reader thread    if (reader == null)     reader = Thread.currentThread ();    // check parameters    if (data == null) {     throw new NullPointerException ();    } else if ((offset < 0) || (offset + length > data.length)      || (length < 0)) { // check indices     throw new IndexOutOfBoundsException ();    } else {     // throw an exception if the stream is closed     closedCheck ();     // throw any pending exception     exceptionCheck ();     if (length <= 0) {      return 0;     } else {      // wait for some data to b

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号