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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 丁晓宇 中级黑马   /  2012-2-16 18:42  /  2993 人查看  /  16 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 丁晓宇 于 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运行,就这样读代码后作答

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

16 个回复

倒序浏览
不让运行,你是在考我们吗?
应该是x一直等于y;然后应该是从0到98都等一遍吧。
回复 使用道具 举报
马欢 发表于 2012-2-16 18:53
不让运行,你是在考我们吗?
应该是x一直等于y;然后应该是从0到98都等一遍吧。 ...

面试官也不给机会运行的 就让看
回复 使用道具 举报
既然xy变量在run方法内,那应该是两线程交替打印0-98
有198个结果吧
回复 使用道具 举报
x,y不是共享数据。所以不会互相影响 - -
打出来的x y都相等,交替运行
回复 使用道具 举报
我也以为:打出来的x y都相等,交替运行,但运行却不是这样,没交替打印。
x y相等,这易明白,但两线程为何不交替打印呢?

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

回复 使用道具 举报
黄秋 发表于 2012-2-16 19:35
我也以为:打出来的x y都相等,交替运行,但运行却不是这样,没交替打印。
x y相等,这易明白,但两线程为 ...

因为用的start方法,这个方法的线程是不安全的,但是效率
回复 使用道具 举报
本帖最后由 pengfangjava 于 2012-2-16 22:14 编辑

程序启动了两个线程,x和y是定义在run()方法中的,所以两个线程中的xy是不互相影响的
结果是,两个线程交替打印x和y,都从1打印到99
回复 使用道具 举报
冯祖焱 黑马帝 2012-2-16 19:50:00
9#
定义在run()方法中的局部变量是独立的,所以两个线程中的x和y是不互相影响的

线程一打印0到98
纯种二打印0到98
回复 使用道具 举报
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

评分

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

查看全部评分

回复 使用道具 举报
1毫秒的价值 发表于 2012-2-16 22:05
1.for 循环解析:不可能从0开始,因为在遍历时候x、y初始化是0第一次直接x++ y++了,然后打印
所以从1开始 ...

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

不仔细看哟,明明有main方法的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马