A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 范明正 黑马帝   /  2011-8-21 16:12  /  1731 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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);
                }
        }
运行后结果是你预期的吗?我对结果有点不太明白求教!

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1

查看全部评分

7 个回复

倒序浏览
黑马网友  发表于 2011-8-21 17:17:40
沙发
我做了个测试
当我输入:
s+回车(也就是输入一个字符+回车键)
结果为:
1,2,3
当我输入:
s+回车(也就是输入二个字符+回车键)
结果为:
1,2,3,4

这样看来解释就是
当运行到read的时候程序为wait状态 当你输入字符后按回车键后
程序就调用notify解除了wait状态,程序运行第一次循环输出1,并且在内存中多了
你输入的字符+回车键;当循环第二次执行到read,它发现内存中有你之前输入的字符就不在是wait状态
而是直接读取内存,read方法每次也只读取一个字符,所以当读取完,再次碰到read方法就会继续等待键盘输入
所以如果你第一次输入的字符串长度大于你的数组循环就会顺利的执行成功!

评分

参与人数 1技术分 +2 收起 理由
admin + 2 你想麻烦了,回车是2个字符\r\n,加s循环3次,

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-8-21 17:18:11
藤椅
纠正下  第二次输入是 ss+回车
回复 使用道具 举报
嗯,大概懂了,从键盘读取的数不只是打上去的,在windows下还有一个回车加换行。也就是说当输入一个字符再按回车的时候,程序实际上是接受了三个字符。所以才会只打印出nt数组的三个数。

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

每接受一个字符,就执行in.read()后面的,for循环剩下的语句
[ 本帖最后由 梁锡伟 于 2011-08-21  18:06 编辑 ]

评分

参与人数 1技术分 +2 收起 理由
admin + 2 对头,没想到你说出来了,害我上面白说

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-8-21 18:03:45
报纸
[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:17
地板

回复 地板 的帖子

in.read()的实质是系统调用了 wait方法   解除wait状态的方法是notify()方法,在Object可以查到
回复 使用道具 举报
原帖由 sunyu 于 2011-08-21 19:22 发表 in.read()的实质是系统调用了 wait方法   解除wait状态的方法是notify()方法,在Object可以查到
...wait和notify方法是在多线程中才能使用吧,一个单线程wait的话就没人叫醒了,我在in.read()打了个断点跟进去,没发现除了主线程以为的线程。。源代码也每调用上面两个方法。。不懂。in.read()就像回调函数一样,但里面的实现机制不太了解
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马