黑马程序员技术交流社区

标题: 关于多线程的问题 [打印本页]

作者: 小黑-张颖    时间: 2011-9-3 19:25
标题: 关于多线程的问题
。。。。。
前面的一些代码我就省略了  
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
......
同步执行


求解
作者: 匿名    时间: 2011-9-3 20:19
我将你的代码复制运行了,没有问题,当然其中把打印时的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
你想要的效果应该是这样的吧[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的资源了 谁就运行
作者: 724681149    时间: 2011-10-15 15:22
    强烈建议楼主看看基础加强的视频,你创建线程的方式太烂了,可读性太差了。
作者: 想好了再写    时间: 2011-10-15 21:42
你会慢慢的发现,你的这个程序每执行一次,结果都是不一样的,每运行一次结果就会改变一次
其实说是同步如果从cpu的角度来讲也不算是同步,只是比原来的单线程的效率高了一些,学习组成原理你会知道,cpu不可能同时运行两个线程(双核cpu不确定)一个时间点只有一个线程在运行,同步多线程是在一个CPU 的时钟周期内能够执行来自多个线程的指令。也就是说原来单线程,主函数只能等待调用函数执行完后自己再继续执行,在一个时间点是一个线程在执行;而多线程同步是    主函数 在其调用的函数执行的时候,它跟调用函数分时段分别执行,也就是说在cpu那里是一人执行一段时间,在一个时间点上仍然是一个线程在执行。声明的是,一个时间点上cpu只能执行一个线程,你就可以明白为什么你认为的结果不对了。词不达意,不知道能看懂不。
作者: 想好了再写    时间: 2011-10-15 21:43
突然发现我文字表达能力这么的差{:soso_e118:}




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