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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© pzfpang449 中级黑马   /  2013-2-1 14:14  /  1573 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张向辉 于 2013-2-1 20:23 编辑

public class Threads1 {
    int x = 0;

    public class Runner implements Runnable {
        public void run() {
            int current = 0;
            for (int i = 0; i < 4; i++) {
                current = x;
                System.out.println(current + ", ");
                x = current + 2;
            }
        }
    }

    public static void main(String[] args) {
        new Threads1().go();
         
    }

    public void go() {
        Runnable r1 = new Runner();
        new Thread(r1).start();
        new Thread(r1).start();
    }
}

我认为运行结果是0,2,4,6,8,10,12但是我的机子上跑出来是0,2,4,6,0,2,4,6,有人能告诉我应该怎么样去正确地理解这段代码么,不是只有一个Thread1对象么
threadjava
亲爱的版主,我还差1技术分就可以进行入学考试了。求版主帮忙!

评分

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

查看全部评分

3 个回复

倒序浏览
        new Thread(r1).start();
        new Thread(r1).start();
        这是两个线程对象了
回复 使用道具 举报
本帖最后由 张权 于 2013-2-1 16:09 编辑

首先楼上的说的对,你开启了两个线程。
你把你的代码多运行几次,你会发现会出现你想要的结果!!
至于为什么会这样呢?这个就涉及到线程的安全问题,不知道你有没有学同步,我把你的代码修改了一下!!!
class Threads1 {
    int x = 0;
    Object obj = new Object();
    public class Runner implements Runnable {
        public void run() {
                synchronized(obj) {
                            int current = 0;
                            for (int i = 0; i < 4; i++) {
                        current = x;
                                               System.out.println(Thread.currentThread().getName() + "=============="+current + ", ");
                         //关于出现0,0,2,2,4,4,6,6的结果,假设我现在这段代码没有用同步,程序有可能当线程0进来后打印出结果是0,
                       //可是当线程0还没有执行下面的x = current + 2,线程1抢到执行权,这个时候current的值是0,以此类推,所以就出
//现了你不想要的结果!!!
                             x = current + 2;
        }
            }
        }
    }

    public static void main(String[] args) {
        new Threads1().go();
         
    }

    public void go() {
        Runnable r1 = new Runner();
        new Thread(r1).start();
        new Thread(r1).start();
    }
}


评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 铿锵科技 于 2013-2-1 16:22 编辑

我认为运行结果是0,2,4,6,8,10,12但是我的机子上跑出来是0,2,4,6,0,2,4,6,有人能告诉我应该怎么样去正确地理解这段代码么,不是只有一个Thread1对象么
threadjava,错了
     Runnable r1 = new Runner();//这创建一个实例
        new Thread(r1).start();//开启一个线程
        new Thread(r1).start();//开启另一个线程
你2个线程中没有通信所以不能打印你所要的结果
要结果是0,2,4,6,8,10,12,可将变量静态化

评分

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

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马