为什么BufferedReader.readLine()阻塞时为什么线程是runnable状态?

Mr_Sky 发布于 2016/10/11 10:01
阅读 1K+
收藏 0

做了个实验,在BufferedReader.readLine()阻塞时,通过工具看到主线程是runnable状态。不明白已经阻塞了为什么还是runnable?请教大家。

实验代码:

	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String line;
		try {
			
			while ((line = br.readLine()) != null) {
				System.out.println(line);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}



线程信息:

名称: main
状态: RUNNABLE
总阻止数: 4, 总等待数: 0


堆栈跟踪: 
java.io.FileInputStream.readBytes(Native Method)
java.io.FileInputStream.read(FileInputStream.java:255)
java.io.BufferedInputStream.read1(BufferedInputStream.java:284)
java.io.BufferedInputStream.read(BufferedInputStream.java:345)
   - 已锁定 java.io.BufferedInputStream@7eb9d3cb
sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
   - 已锁定 java.io.InputStreamReader@4516069b
java.io.InputStreamReader.read(InputStreamReader.java:184)
java.io.BufferedReader.fill(BufferedReader.java:161)
java.io.BufferedReader.readLine(BufferedReader.java:324)
   - 已锁定 java.io.InputStreamReader@4516069b
java.io.BufferedReader.readLine(BufferedReader.java:389)

加载中
0
51_future
51_future

1、BufferedReader.readLine()这句代码跟线程状态无关,不能用来控制线程的状态;

2、线程阻塞,常见的为创建了线程,在执行过程中调用了sleep或wait等方法,或者是执行了线程锁等,这个线程会进入阻塞状态;

3、这儿有篇文章https://my.oschina.net/flashsword/blog/114527,可以学习下,希望能帮到你;

Mr_Sky
Mr_Sky
回复 @51_future : 谢谢。说到点上了。我去巩固下相关内容
51_future
51_future
回复 @Mr_Sky : readline是IO阻塞,不是线程阻塞,两个概念。
Mr_Sky
Mr_Sky
readline的阻塞是靠什么实现的?
51_future
51_future
回复 @notreami : 谢谢宝贵意见,下回会做的越来越好的。
notreami
notreami
格式不统一,实在不能忍受。。。
1
xpbob
xpbob

你的堆栈只显示了你加锁,没有显示其他,阻塞的线程会显示waiting on的情况,如下

 - waiting on <0x04005f50> (a java.lang.ref.Reference$Lock)
 at java.lang.Object.wait(Unknown Source)
 at java.lang.ref.Reference.tryHandlePending(Unknown Source)
 - locked <0x04005f50> (a java.lang.ref.Reference$Lock)
 at java.lang.ref.Reference$ReferenceHandler.run(Unknown Source)

还有你说的是IO阻塞,并不是线程阻塞,这是两个概念,IO阻塞一般不会造成线程阻塞


Mr_Sky
Mr_Sky
是我概念有误。谢谢。
0
GestureWei
GestureWei
用什么工具查的,以及查看线程的时机
GestureWei
GestureWei
回复 @Mr_Sky : 看了一下java源代码,源代码中描述的java线程的状态有五种,其中RUNNABLE和BLOCKED是不一样的,RUNNABLE定义为等待资源,BLOCKED定义为等待锁,所以跟操作系统中的线程的就绪态、运行态和阻塞态并不一样
Mr_Sky
Mr_Sky
jconsole,readline阻塞前后的时候看的
返回顶部
顶部