如果我们直接调用run()方法而不是start()方法怎么办()

每个线程都在单独的调用堆栈中启动。从主线程调用run()方法, run()方法转到当前调用堆栈, 而不是新调用堆栈的开头。
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 } }

立即测试
Output:running...

如果我们直接调用run()方法而不是start()方法怎么办()

文章图片
如果你直接调用run()方法会出现问题
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(); } }

【如果我们直接调用run()方法而不是start()方法怎么办()】立即测试
Output:1 2 3 4 5 1 2 3 4 5

如你在上面的程序中看到的, 没有上下文切换, 因为在这里t1和t2将被视为普通对象而不是线程对象。

    推荐阅读