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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小黑-张颖 黑马帝   /  2011-9-3 19:25  /  2406 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

。。。。。
前面的一些代码我就省略了  
public static void main(String[] args)
{
Runnable mt1=new MyThread();
Runnable mt2=new MyThread();
new Thread(mt1).start();
new Thread(mt2).start();
}

class MyThread implements Runnable
{
public void run()
{for(int i=0;i<5;i++)
System.out.println(Thread.currentThread().getName()+":"+"i");
}
}


从这个程序里面,打印的结果是:
Thread-0:0
Thread-1:1
Thread-0:2
Thread-1:3
Thread-0:4


我的问题是多线程不是同步执行的吗?
如果是这样,那打印结果应该是这样
Thread-0:0
Thread-1:0
......
同步执行


求解

评分

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

查看全部评分

6 个回复

倒序浏览
楼主的代码看似有点乱,我整理了一下:
[code=java]class L
{
        public static void main(String[] args)
        {
                Runnable  mt1=new MyThread();
                Runnable  mt2=new MyThread();
                new Thread(mt1).start();
                new Thread(mt2).start();
        }
}


class MyThread implements Runnable
{
    public void run()
        {
                for(int i=0;i<100;i++)
                {
                   System.out.println(Thread.currentThread().getName()+":"+i);
                }
        }
} [/code]
线程同步,是有先后顺序的,CPU决定谁先谁后,且不可从字面理解为“同时执行”(比如同时打印 0),
[ 本帖最后由 黑马李刚 于 2011-09-03  20:11 编辑 ]

评分

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

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-3 20:19:16
藤椅
我将你的代码复制运行了,没有问题,当然其中把打印时的i旁边的双引号去掉,结果如下
Thread-1:0
Thread-1:1
Thread-1:2
Thread-1:3
Thread-1:4
Thread-0:0
Thread-0:1
Thread-0:2
Thread-0:3
Thread-0:4完全没有问题,可以说你上面这段代码是没有问题的。其实多线程所谓的同步并不是真的同步,而是计算机执行分别执行一个线程一会儿,几个线程交替执行,而同一时间内只有一个线程在执行,由于速度非常非常快,所以看作同步,但是由于现在cpu实现了多核多线程,那倒是真的可以做到同步。至于你为什么会有那样的结果,我觉的应该是其他原因引起的,不知是不是你省略的那部分代码引起的。
回复 使用道具 举报
黑马网友  发表于 2011-9-3 23:55:33
板凳
你想要的效果应该是这样的吧[code]class MyThread implements Runnable{        // 实现Runnable接口,作为线程的实现类
        private String name ;                // 表示线程的名称
        public MyThread(String name){
                this.name = name ;                // 通过构造方法配置name属性
        }
        public void run(){        // 覆写run()方法,作为线程 的操作主体
                for(int i=0;i<10;i++){
                        System.out.println(name + "运行,i = " + i) ;
                }
        }
};
public class RunnableDemo01{
        public static void main(String args[]){
                MyThread mt1 = new MyThread("线程A ") ;         // 实例化对象
                MyThread mt2 = new MyThread("线程B ") ;         // 实例化对象
                Thread t1 = new Thread(mt1) ;                // 实例化Thread类对象
                Thread t2 = new Thread(mt2) ;                // 实例化Thread类对象
                t1.start() ;        // 启动多线程
                t2.start() ;        // 启动多线程
        }
};[/code]输出的结果:
线程A 运行,i = 0
线程A 运行,i = 1
线程B 运行,i = 0
线程A 运行,i = 2
线程B 运行,i = 1
线程A 运行,i = 3
线程B 运行,i = 2
线程A 运行,i = 4
线程B 运行,i = 3
线程A 运行,i = 5
线程B 运行,i = 4
线程A 运行,i = 6
线程B 运行,i = 5
线程A 运行,i = 7
线程B 运行,i = 6
线程A 运行,i = 8
线程B 运行,i = 7
线程A 运行,i = 9
线程B 运行,i = 8
线程B 运行,i = 9

谁抢到CPU的资源了 谁就运行
回复 使用道具 举报
    强烈建议楼主看看基础加强的视频,你创建线程的方式太烂了,可读性太差了。

评分

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

查看全部评分

回复 使用道具 举报
你会慢慢的发现,你的这个程序每执行一次,结果都是不一样的,每运行一次结果就会改变一次
其实说是同步如果从cpu的角度来讲也不算是同步,只是比原来的单线程的效率高了一些,学习组成原理你会知道,cpu不可能同时运行两个线程(双核cpu不确定)一个时间点只有一个线程在运行,同步多线程是在一个CPU 的时钟周期内能够执行来自多个线程的指令。也就是说原来单线程,主函数只能等待调用函数执行完后自己再继续执行,在一个时间点是一个线程在执行;而多线程同步是    主函数 在其调用的函数执行的时候,它跟调用函数分时段分别执行,也就是说在cpu那里是一人执行一段时间,在一个时间点上仍然是一个线程在执行。声明的是,一个时间点上cpu只能执行一个线程,你就可以明白为什么你认为的结果不对了。词不达意,不知道能看懂不。
回复 使用道具 举报
突然发现我文字表达能力这么的差{:soso_e118:}

评分

参与人数 1技术分 +2 收起 理由
admin + 2 多练练 !

查看全部评分

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