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();
          
    }}

解决方案 »

  1.   

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

  2.   

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

  3.   

    对 这样调用run只是一个普通方法
    public void run() {
        if (target != null) {
            target.run();
        }
    }