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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

罗理

初级黑马

  • 黑马币:

  • 帖子:

  • 精华:

© 罗理 初级黑马   /  2013-2-16 22:40  /  1494 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 罗理 于 2013-2-17 00:09 编辑

线程one的代码如下,设置object的name为oneone,然后打印class Threadone extends Thread
{   private TestObject object;
        public Threadone(TestObject obj)
        {
        this.object=obj;
        }

        public void run()
        {   
                for(int x=0;x<20;x++)
                {
                object.setName("oneone");
                System.out.println(object.getName()+"--------Threadone--"+x);
                }
        }
}
线程two的代码如下,
class Threadtwo extends Thread
{
        private TestObject object;
        public Threadtwo(TestObject obj)
        {
        this.object=obj;
        }
        public void run()
        {
                for(int x=0;x<20;x++)   
                {        
                        object.setName("namechange");
                        System.out.println(object.getName()+"--------two--"+x);
                }
        }
}
设置object的name为namechange,然后打印——————————运行的结果如图

我的理解是:首先线程1抢到了cpu资源,执行object.setName("oneone"); 但是还没有执行下一句就被线程2抢到了cpu资源,将object的name改为namechange,然后cpu被线程1抢去,执行System.out.println(object.getName()+"--------Threadone--"+x);所以打印的是namechange————threadone———0,然后线程1进行执行for循环打印出x为1和2.随后线程2得到cpu,执行了System.out.println(object.getName()+"--------two--"+x); 打印的是namechange————two——0;——————————————————我要问的是————在打印出namechange————threadone———0 时   显然线程1的object.setName("oneone"); 这一段有被执行到,同时线程1的x值为0,当线程1再次获得cpu时不是for循环重新执行一遍而是继续往下执行。那么,看上图第四行运行结果namechange——————two—-0;这项结果显示线程2执行System.out.println(object.getName()+"--------two--"+x);代码,x值为0表示还是进行的第一次循环,但是线程2的第一次for循环中的objcet.setName("namechange");早就被执行掉了,现在却把namechange打印出来————这里表示不理解,求高人指点

评分

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

查看全部评分

2 个回复

倒序浏览
在视频里面毕老师有说过(第十一天,07)
这是由于你的电脑是双核的,你的第四行已经读完但是还没来的及打印
如果是电脑是单核的就不会有这个问题
回复 使用道具 举报
谢谢!!!!!!!!!!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马