Java 线程的run()和start()
精华
小牛编辑
105浏览
2023-03-14
一个常见的问题:为什么启动线程是调用start()方法,而不是调用run()方法呢?
答案:
- 每个线程都在单独的调用堆栈中启动。
- 从主线程调用run()方法,run()方法转到当前调用堆栈,而不是新调用堆栈的开头。
如下面例子所示:
package cn.xnip;
/**
* 小牛知识库网: https://www.xnip.cn
*/
/**
* 启动线程的错误示范
*/
class Demo extends Thread{
public void run(){
System.out.println("running...");
}
public static void main(String args[]){
Demo t1=new Demo();
t1.run();//这样调用不回启动单独的调用堆栈
}
}
输出结果为:
running...
以上程序Demo的run()线程方法和Demo的main()方法都是处于主线程中,换句话说,这里并没有创建新的线程。
如果直接调用run()方法,则会出现问题。如下所示:
package cn.xnip;
/**
* 小牛知识库网: https://www.xnip.cn
*/
/**
* 启动线程的错误示范
*/
class Demo 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[]){
Demo t1=new Demo();
Demo t2=new Demo();
t1.run();
t2.run();
}
}
1
2
3
4
1
2
3
4
正如在上面的程序中看到的那样,程序执行并没有上下文切换,因为这里t1和t2将被视为普通对象而不是线程对象