线程直接调用run()方法而不是start()方法

线程直接调用run()方法而不是start()方法

如果直接调用run()方法而不是start()方法会怎么样?

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

参考示例代码:

package com.zyiz;

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.zyiz;

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

正如在上面的程序中看到的那样,程序执行并没有上下文切换,因为这里t1t2将被视为普通对象而不是线程对象。