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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈晓东 黑马帝   /  2011-10-4 18:45  /  1761 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

[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

3 个回复

倒序浏览
黑马网友  发表于 2011-10-4 21:22:15
沙发
因为你for循环的次数太少了,S先启动,A后启动,当A的线程还没启动的时候,S的线程已经运行完了。
你把for循环的次数设为1000就会出现交替运行。
回复 使用道具 举报
黑马网友  发表于 2011-10-4 21:46:10
藤椅
for循环次数才少了
回复 使用道具 举报
虽然楼上所说的不是我想要的答案 但是依然我依然懂了。
这是因为两线程并发执行,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 编辑 ]
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马