黑马程序员技术交流社区

标题: 一个例子程序 [打印本页]

作者: 范明正    时间: 2011-8-21 16:12
标题: 一个例子程序
public static void main(String[] args) throws Exception{
                int[] x = {1,2,3,4,5,6};
                for(int y:x){
                        System.in.read();
                        System.out.println(y);
                }
        }
运行后结果是你预期的吗?我对结果有点不太明白求教!
作者: 匿名    时间: 2011-8-21 17:17
我做了个测试
当我输入:
s+回车(也就是输入一个字符+回车键)
结果为:
1,2,3
当我输入:
s+回车(也就是输入二个字符+回车键)
结果为:
1,2,3,4

这样看来解释就是
当运行到read的时候程序为wait状态 当你输入字符后按回车键后
程序就调用notify解除了wait状态,程序运行第一次循环输出1,并且在内存中多了
你输入的字符+回车键;当循环第二次执行到read,它发现内存中有你之前输入的字符就不在是wait状态
而是直接读取内存,read方法每次也只读取一个字符,所以当读取完,再次碰到read方法就会继续等待键盘输入
所以如果你第一次输入的字符串长度大于你的数组循环就会顺利的执行成功!
作者: 匿名    时间: 2011-8-21 17:18
纠正下  第二次输入是 ss+回车
作者: 梁锡伟    时间: 2011-8-21 18:02
嗯,大概懂了,从键盘读取的数不只是打上去的,在windows下还有一个回车加换行。也就是说当输入一个字符再按回车的时候,程序实际上是接受了三个字符。所以才会只打印出nt数组的三个数。

同理如果输入两个字符,也就是程序实际接受了四个字符,所以会打印出1234出来

每接受一个字符,就执行in.read()后面的,for循环剩下的语句
[ 本帖最后由 梁锡伟 于 2011-08-21  18:06 编辑 ]
作者: 匿名    时间: 2011-8-21 18:03
[quote] 原帖由 [i]sunyu[/i] 于 2011-08-21 17:17 发表 [url=http://bbs.itheima.com/redirect.jsp?goto=findpost&pid=7980&ptid=1224][img]http://bbs.itheima.com/images/common/back.gif[/img][/url]我做了个测试
当我输入:
s+回车(也就是输入一个字符+回车键)
结果为:
1,2,3
当我输入:
s+回车(也就是输入二个字符+回车键)
结果为:
1,2,3,4

这样看来解释就是
当运行到read的时候程序为wait状态 当你输入字符后按回车键后
程序就调用notify解除了wait状态,程序运行第一次循环输出1,并且在内存中多了
你输入的字符+回车键;当循环第二次执行到read,它发现内存中有你之前输入的字符就不在是wait状态
而是直接读取内存,read方法每次也只读取一个字符,所以当读取完,再次碰到read方法就会继续等待键盘输入
所以如果你第一次输入的字符串长度大于你的数组循环就会顺利的执行成功! [/quote]in.read是堵塞现象吧。。。
作者: 匿名    时间: 2011-8-21 19:22
标题: 回复 地板 的帖子
in.read()的实质是系统调用了 wait方法   解除wait状态的方法是notify()方法,在Object可以查到
作者: 梁锡伟    时间: 2011-8-21 19:39
原帖由 sunyu 于 2011-08-21 19:22 发表 in.read()的实质是系统调用了 wait方法   解除wait状态的方法是notify()方法,在Object可以查到
...wait和notify方法是在多线程中才能使用吧,一个单线程wait的话就没人叫醒了,我在in.read()打了个断点跟进去,没发现除了主线程以为的线程。。源代码也每调用上面两个方法。。不懂。in.read()就像回调函数一样,但里面的实现机制不太了解




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2