黑马程序员技术交流社区
标题:
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