public class Q02 implements Runnable { /**
 * @param args
 */
public void run()
{
while(true)
{
   System.out.println("abc");
    }
}

public static void main(String[] args)
{
// TODO Auto-generated method stub
  Q02 q1 = new Q02();
          Thread t1 = new Thread(q1,"001");
          Thread t2 = new Thread(q1,"002");
          System.out.println(t1.getName());
          System.out.println(t2.getName());
        
          try
          {
             t1.sleep(10000);
      }
          catch(Exception e){}
         // t1.start();
          t1.run();
          
    }}
上面代码中 我如果把t1.start();注释掉,直接t1.run(); 也一样可以运行,线程不需要start(可运行状态) ,直接进入运行状态也是可以的??

解决方案 »

  1.   

    t1.run 是主线程在里面跑 相当于主线程的函数调用    跑的不是你new的子线程
      

  2.   

    run方法不应该你来调,而是在你调用start后,由虚拟机调用。调用run方法不会启动一个线程,它和调用一个普通方法是一样的。调用start才是启动线程。试试:
    t1.start();
    t2.start();和:            t1.run();
                    t2.start();   就知道二者的不同了。后者是阻塞式调用。t1不完成,t2就永远不会启动。
    前者就不同了,两个是不同的线程。        
      

  3.   

    你写个Run()方法的话,没有start()就不行
      

  4.   

    线程的start方法执行后,通过java虚拟机调用该线程的run方法,
    而如果该线程是通过实现Runnable接口来构造的,他就可以直接调用Runnable的run方法,而不需要start方法区
    调用run方法
    ,建议看看jdk帮助
      

  5.   

    刚才用 Thread.currentThread().getName()方法验证了一下,发现1楼的兄弟说的很对,如果不写start()方法确实只是main这个线程在工作。如果写成
    t1.start();
    t1.run();那就是main 和 T1 两个线程 随机调用run()方法。