黑马程序员技术交流社区

标题: 请问X和Y的值会有怎样的变化 [打印本页]

作者: 丁晓宇    时间: 2012-2-16 18:42
标题: 请问X和Y的值会有怎样的变化
本帖最后由 丁晓宇 于 2012-2-16 20:52 编辑
  1. public class TestMain implements Runnable {
  2.         public void run() {
  3.                 int x = 0;
  4.                 int y = 0;
  5.                 for (int i = 0; i < 99; i++) {
  6.                         x++;
  7.                         y++;
  8.                         System.out.println("x:" + x + " y:" + y);
  9.                 }
  10.         }
  11.        
  12.         public static void main(String[] args) {
  13.                 new Thread(new TestMain()).start();
  14.                 new Thread(new TestMain()).start();
  15.         }
  16. }
复制代码
这是某公司的一道面试题,写在黑板上问的。大家不要copy运行,就这样读代码后作答
作者: 马欢    时间: 2012-2-16 18:53
不让运行,你是在考我们吗?
应该是x一直等于y;然后应该是从0到98都等一遍吧。
作者: 丁晓宇    时间: 2012-2-16 18:57
马欢 发表于 2012-2-16 18:53
不让运行,你是在考我们吗?
应该是x一直等于y;然后应该是从0到98都等一遍吧。 ...

面试官也不给机会运行的 就让看
作者: 彭嘉聪    时间: 2012-2-16 19:02
既然xy变量在run方法内,那应该是两线程交替打印0-98
有198个结果吧
作者: 陈丹阳    时间: 2012-2-16 19:12
x,y不是共享数据。所以不会互相影响 - -
打出来的x y都相等,交替运行
作者: 黄秋    时间: 2012-2-16 19:35
我也以为:打出来的x y都相等,交替运行,但运行却不是这样,没交替打印。
x y相等,这易明白,但两线程为何不交替打印呢?
作者: 丁晓宇    时间: 2012-2-16 19:39
黄秋 发表于 2012-2-16 19:35
我也以为:打出来的x y都相等,交替运行,但运行却不是这样,没交替打印。
x y相等,这易明白,但两线程为 ...

因为用的start方法,这个方法的线程是不安全的,但是效率
作者: 彭小芳    时间: 2012-2-16 19:44
本帖最后由 pengfangjava 于 2012-2-16 22:14 编辑

程序启动了两个线程,x和y是定义在run()方法中的,所以两个线程中的xy是不互相影响的
结果是,两个线程交替打印x和y,都从1打印到99
作者: 冯祖焱    时间: 2012-2-16 19:50
定义在run()方法中的局部变量是独立的,所以两个线程中的x和y是不互相影响的

线程一打印0到98
纯种二打印0到98
作者: 戚雪晖    时间: 2012-2-16 22:05
1.for 循环解析:不可能从0开始,因为在遍历时候x、y初始化是0第一次直接x++ y++了,然后打印
所以从1开始,在到98时候,进了循环累加了一次,因此最后的值是99
2.然后创建了俩线程并开启。这样会互相交替执行run()方法,而且x,y是在run()内的局部变量,因此两个线程不会影响,都从x、y初始值0开始执行。
因此这两个线程相互交替执行打印 x=1,y=1.............x=99,y=99
作者: 彭小芳    时间: 2012-2-16 22:13
1毫秒的价值 发表于 2012-2-16 22:05
1.for 循环解析:不可能从0开始,因为在遍历时候x、y初始化是0第一次直接x++ y++了,然后打印
所以从1开始 ...

是的,从1开始打印,两个线程互不影响
作者: 黄锦成    时间: 2012-2-16 23:11
各自打印:从1到99
作者: hxc2008q    时间: 2012-2-17 00:05
从1开始到98应该没什么问题
我觉得线程打印的时候不一定完全交互吧,跟CPU的运行调度有关系吧
作者: 黄秋    时间: 2012-2-17 01:18
实际测试过,在我的古董机上,用java 的集成IDE 编辑器运行,两线程不交替打印,但在Dos命令模式下,会交替打印。可见,最接近底层的环境,现象越少干扰,结果越精确。
作者: 王康    时间: 2012-2-17 09:59
直觉上感觉结果为:
线程一打印 x=1,y=1.............x=99,y=99
因为x会始终和y相等.
但是,不清楚,为什么两个线程不交互打印?应该好好思考一下,确实是有水平的一道题!
作者: 花开~的季节    时间: 2012-2-17 10:54
主函数执行的类都没得,怎么执行,jvm根本找不到执行的接口;
作者: 丁晓宇    时间: 2012-3-1 13:05
花开~的季节 发表于 2012-2-17 10:54
主函数执行的类都没得,怎么执行,jvm根本找不到执行的接口;

不仔细看哟,明明有main方法的




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