如果直接调用run()
方法而不是start()
方法会怎么样?
每个线程在一个单独的调用堆栈中启动。
从主线程调用run()
方法,run()
方法进入当前调用堆栈而不是新调用堆栈的开头。
参考示例代码:
package com.zaixian;
class TestCallRun1 extends Thread {
public void run() {
System.out.println("running...");
}
public static void main(String args[]) {
TestCallRun1 t1 = new TestCallRun1();
t1.run();// fine, but does not start a separate call stack
}
}
执行上面示例代码,得到以下结果:
running...
如果直接调用run()
方法,则会出现问题。参考以下示例代码:
package com.zaixian;
class TestCallRun2 extends Thread {
public void run() {
for (int i = 1; i < 5; i++) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
System.out.println(e);
}
System.out.println(i);
}
}
public static void main(String args[]) {
TestCallRun2 t1 = new TestCallRun2();
TestCallRun2 t2 = new TestCallRun2();
t1.run();
t2.run();
}
}
执行上面示例代码,得到以下结果:
1
2
3
4
1
2
3
4
正如在上面的程序中看到的那样,程序执行并没有上下文切换,因为这里t1
和t2
将被视为普通对象而不是线程对象。
上一篇:
Java两次启动线程
下一篇:
加入线程