黑马程序员技术交流社区

标题: java多线程问题 [打印本页]

作者: 陈晓东    时间: 2011-10-4 18:45
标题: java多线程问题
[code=java]class S implements Runnable {
        public S() {
                System.out.println("Runnable starts!");
        }
        public void run() {
                for(int i=0;i<3;i++) {
                        System.out.println("Runnable");
                }
        }
}

public class A extends Thread {
        public A() {
                System.out.println("Thread Starts!");
        }
        public void run() {
                for(int i=0;i<3;i++) {
                        System.out.println("Thread");
                }
        }
        public static void main(String[] args) {
                new Thread(new S()).start();
                new A().start();
        }
}[/code]输出结果
Runnable starts!
Thread Starts!
Runnable
Runnable
Runnable
Thread
Thread
Thread
为什么不是
Runnable starts!
Thread Starts!
Runnable
Thread
Runnable
Thread
Runnable
Thread
作者: 匿名    时间: 2011-10-4 21:22
因为你for循环的次数太少了,S先启动,A后启动,当A的线程还没启动的时候,S的线程已经运行完了。
你把for循环的次数设为1000就会出现交替运行。
作者: 匿名    时间: 2011-10-4 21:46
for循环次数才少了
作者: 陈晓东    时间: 2011-10-4 22:30
虽然楼上所说的不是我想要的答案 但是依然我依然懂了。
这是因为两线程并发执行,cpu随机分配的资源。我并没有设置优先级和等待唤醒机制。
但是有人说这是java的运行机制
public static void main(String[] args) {
        new Thread(new S()).start();
        new A().start();
}

这个代码中,java运行步骤如下:
new S()、new A()(如果在new A的过程中出现了错误,你会发现,new S的对象永远是已经构造好的、可以直接拿来使用,具体可通过编辑器的调试步骤进行验证。)
把两个对象压入栈(如果两个对象都实例化完毕)
按顺序执行对象赋予的方法,也就是.start()。

也就是说,在java里,所有的实例方法再被直接使用之前,实例都必须保证是被正确实例化的,所以,遇到你的这种情况,java会先实例化对象,然后才会按照你的代码顺序执行代码。
[ 本帖最后由 陈晓东 于 2011-10-04  22:38 编辑 ]




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