Java 线程的run()和start()

一个常见的问题:为什么启动线程是调用start()方法,而不是调用run()方法呢?

答案:

  • 每个线程都在单独的调用堆栈中启动。
  • 从主线程调用run()方法,run()方法转到当前调用堆栈,而不是新调用堆栈的开头。

如下面例子所示:

package com.yiidian;

/**
 * 一点教程网: http://www.yiidian.com
 */
/**
 *  启动线程的错误示范
 */
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 com.yiidian;

/**
 * 一点教程网: http://www.yiidian.com
 */
/**
 *  启动线程的错误示范
 */
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将被视为普通对象而不是线程对象

热门文章

优秀文章