如果我们直接调用Java的run()方法而不是start()方法会发生什么?

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

文件名:TestCallRun1.java

class TestCallRun1 extends Thread{  
 public void run(){  
   System.out.println("running...");  
 }  
 public static void main(String args[]){  
  TestCallRun1 t1=new TestCallRun1();  
  t1.run();//很好,但不会启动单独的调用堆栈
 }  
}  

输出:

running...

图

直接调用run()方法的问题

文件名:TestCallRun2.java

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, Java面试题, Java下载, java教程, java技术, Java学习, Java学习教程, Java语言, Java开发, Java入门教程, Java进阶教程, Java高级教程, Java笔试题, Java编程思想