iteye_12441 2012-09-07 12:52 采纳率: 100%
浏览 135
已采纳

java core第二次第2页,关于流的两个问题?

[quote]inputStream的read()和write()方法在执行时都将阻塞,直至字节确实被读入或写出.这就意味着如果流不能被立即访问,那么当前的线程将被阻塞.这使得这个方法等待指定的流变为可用的这段时间里,其他的线程就有机会去执行有用的工作.[/quote]
阻塞的情况下,其他的线程是没有机会去执行

[quote]available方法使我们可以去检查当前可用于读入的字节数量,这意味着像下面这样的代码片段就不可能被阻塞:
int byteavailable=in.available();
if(byteavailable>0){
byte[] data=new byte[byteavailable];
in.read(data);
}[/quote]
这段代码不阻塞,又是什麽意思啊?

  • 写回答

2条回答 默认 最新

  • jinnianshilongnian 2012-09-07 13:26
    关注

    摘自InputStream javadoc
    [quote]available()
    返回下一次对此输入流调用的方法可以不受阻塞地从此输入流读取(或跳过)的估计剩余字节数。下一个调用者可能是同一个线程,也可能是另一个线程。一次读取或跳过此数量个字节不会发生阻塞,但读取或跳过的字节可能小于该数。 [/quote]
    即表示我们可以一次性不阻塞拿到的字节量。

    [quote]read()
    从此输入流中将 len 个字节的数据读入一个 byte 数组中。如果 len 不为 0,则在输入可用前,此方法将阻塞;否则,不读取任何字节并且返回 0。[/quote]
    比如从控制台输入 我们调用read可能发生阻塞

    你的第一个问题:
    当A线程读字节发生阻塞,则等待让出CPU周期,B线程这时候可以使用CPU完成其他工作。 线程并发问题。

    第二个问题
    available 即表示我们可以一次性不阻塞拿到的字节量。读这些数量的字节不会发生阻塞。

    阻塞的情况下,其他的线程是没有机会去执行才对啊?
    这个理解有误,A线程阻塞, 即A让出CPU周期,此时其他线程可以使用CPU周期了。
    线程之间是并发执行。只要有些线程让出CPU 其他线程才能工作。

    A(读取字节 发生阻塞)和B(这个可能在计算1+2+....+1000 ) 两者可能是无关的任务
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥17 pro*C预编译“闪回查询”报错SCN不能识别
  • ¥15 微信会员卡接入微信支付商户号收款
  • ¥15 如何获取烟草零售终端数据
  • ¥15 数学建模招标中位数问题
  • ¥15 phython路径名过长报错 不知道什么问题
  • ¥15 深度学习中模型转换该怎么实现
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 如何用python向钉钉机器人发送可以放大的图片?
  • ¥15 matlab(相关搜索:紧聚焦)