[quote]inputStream的read()和write()方法在执行时都将阻塞,直至字节确实被读入或写出.这就意味着如果流不能被立即访问,那么当前的线程将被阻塞.这使得这个方法等待指定的流变为可用的这段时间里,其他的线程就有机会去执行有用的工作.[/quote]
阻塞的情况下,其他的线程是没有机会去执行
[quote]available方法使我们可以去检查当前可用于读入的字节数量,这意味着像下面这样的代码片段就不可能被阻塞:
int byteavailable=in.available();
if(byteavailable>0){
byte[] data=new byte[byteavailable];
in.read(data);
}[/quote]
这段代码不阻塞,又是什麽意思啊?
摘自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 ) 两者可能是无关的任务
第二段代码是判断是否有东西可以读,才去读,当然不会阻塞了。