我又把程序改了一下,这下没那么多的麻烦,编译运行都行了。
以下是我改过的
class wjggai extends Thread implements Runnable 
{
   //Thread wjg;
   //int i=0;
  /* public wjggai()
{
   wjg=new Thread(this);
}*/
   public void run()
{
   for (int i=0;i<=3;i++)
{
   System.out.println("我是一个学生!");
    try
{
   sleep(3000);
    }
   catch(InterruptedException e){}
     
}
}
/*public void start()
{
wjg.start();
}*/

  public static void main(String args[])
{  
   wjggai w1=new wjggai();
     w1.start();
}
}
这下没问题了! :)

解决方案 »

  1.   

    好像也没问题啊class wjggai implements Runnable
    {
       Thread wjg;
       //int i=0;
       public wjggai()
    {
       wjg=new Thread(this);
    }
       public void run()
    {
       for (int i=0;i<=3;i++)
    {
       System.out.println("我是一个学生!");
        try
    {
    wjg.sleep(3000);
        }
       catch(InterruptedException e){}
         
    }
    }
    public void start() 
    {
    wjg.start();
    }

      public static void main(String args[])
    {  
            wjggai w1=new wjggai();
         w1.start();
    }
    }
      

  2.   

    第一程序w1.start();中的w1是一个什么对象啦,只是一个普通对象,并非是一个Thread对象呢,
    第二程序因为你继承了Thread这个类啦,所以你可以start()了!!
      

  3.   

    可第一个程序中如果把wjggai w1=new wjggai(); w1.start();去了,编译可以通过,但运行却没有任何结果!
      

  4.   

    Runnable是一个只有run()的接口,一开始的程序注释掉start()当然找不到此方法。要运行线程就得用Thread(Runnable target).start().而后面你用的是继承了Thread的类,这个类里面有实现了的start(),所以你就可以运行了,粗略的看了一下不知道是不是
      

  5.   

    因为Runnable是接口,它里面只有一个未实现的 run() 方法。第一个例子中,你在主方法中,只是创建了一个继承Runnable接口的对象。此类中并没有start()方法。所以你在主方法中写 w1.start()是错的。第一个例子你可以在构造函数加上一名 wjg.start(),并主方法中的 w1.start() 去掉就行了。
        而你的第二个例子,有一个地方是多此一举的,你只要继承 Thread 类就行了,不用实现 Runnable 接口。也就是说你只要写 class wjggai extends Thread 就可以了。而它为什么能运行成功就因为 Thread 类中有一个 start() 方法,而 wjggai 类继承了 Thread 类就说明它也继承了 Thread类的 start() 方法,所以能运行成功!
        我是这样觉得的,不知道对你有没有帮助!   ^_^
      

  6.   

    class wjggai_1 implements Runnable 
    {
       Thread wjg;
        wjggai_1()
    {
       wjg=new Thread(this);
    }
       public void run()
    {
       for (int i=0;i<=3;i++)
    {
       System.out.println("我是一个学生!");
        try
    {
    wjg.sleep(3000);
        }
       catch(InterruptedException e){}
         
    }
    }
    public void start()    
    {
    wjg.start();
    }

      public static void main(String args[])
    {  
            wjggai_1 w1=new wjggai_1();
          w1.start();
    }
    }
    这是我第一个要问的问题,在这一个类中为什么要调用二个start()方法才能使程序有运行结果。
    去掉public void start()    
    {
    wjg.start();
    }
    会报w1.start();是个错误的方法,而去掉w1.start();则编译可过,但运行没有结果。
    这是什么道理?下面是我作的改动:
    //import java.awt.*;
    class wjggai extends Thread implements Runnable 
    {   public void run()
    {
       for (int i=0;i<=3;i++)
    {
       System.out.println("我是一个学生!");
        try
    {
       sleep(3000);
        }
       catch(InterruptedException e){}
         
    }
    }

      public static void main(String args[])
    {  
       wjggai w1=new wjggai();
         w1.start();
    }
    }
     我把Thread类和Runnable接口都用上,程序更简洁,运行也成功了。
    大家看看这两个程序,发表一下你们的意见。
    谢谢!
      

  7.   

    这是我第一个要问的问题,在这一个类中为什么要调用二个start()方法才能使程序有运行结果。
    去掉public void start()    
    {
    wjg.start();
    }
    会报w1.start();是个错误的方法,而去掉w1.start();则编译可过,但运行没有结果。
    这是什么道理?不管怎样要线程启动都得调用Tread中的start(),你说调用了两次,只不过是你的那个做了个中介而已。
      

  8.   

    这是我第一个要问的问题,在这一个类中为什么要调用二个start()方法才能使程序有运行结果。
    去掉public void start()    
    {
    wjg.start();
    }
    会报w1.start();是个错误的方法,而去掉w1.start();则编译可过,但运行没有结果。
    这是什么道理?因为w1是wjggai类的实例,去掉public void start()这个以后,wjggai中就已经没有start()这个方法了那当然会报w1.start();是个错误的方法啦。
    而你去掉主函数中的w1.start()程序是没错,编译是可以通过,但是并没有启动线程当然运行就没有结果了。
      

  9.   

    注释中的start()方法和主函数中的start()方法有什么不同?注释中的start()方法是Thread 类的方法
    而主函数中主函数中的start()方法是wjggai类的方法
    你把第一个中:
    public void start()改为public void startThread()
    下面主函数中:
    w1.start();改为w1.startThread();
    这样就应该明白了 
      

  10.   

    你就是把两个start方法弄混了,所以才晕的!
    你的wjg.start()的调用才使得你的线程开始运行!
        而你w1.start()的调用只不过是要调用wjggai类中你自己编写的start()方法,而这个方法可以取任何可行了名字。而你好巧不巧的用了start这个名字而已!^_^
      

  11.   

    sochikit(唔系好人)你好!
    谢谢你的热情帮助。你说:“你的wjg.start()的调用才使得你的线程开始运行!
        而你w1.start()的调用只不过是要调用wjggai类中你自己编写的start()方法,而这个方法可以取任何可行了名字。而你好巧不巧的用了start这个名字而已!”
     
    按你说的,w1.start()是wjggai类中调用的方法,是我自己编写的方法,巧的是同名而已。那这么说w1.start()在程序中也就不能调用run()方法了。
    可我把程序中的w1.start()注释掉,编译可以通过。运行却没结果。
    看来少了w1.start()方法的调用,还是不行。
    我想这与你说的
    “而你w1.start()的调用只不过是要调用wjggai类中你自己编写的start()方法,而这个方法可以取任何可行了名字。而你好巧不巧的用了start这个名字而已!”
    有点矛盾!
    欢迎参加讨论!谢谢!!!
      

  12.   

    回错对象了,真对不起。
    sochikit(唔系好人)说的很对,我用你的办法,作了出来。上面我回错对象了,那句话不是你说的。:)我还想请大家看看我改后的程序。
    我是把Thread类和接口都用上了。结果也出来了,而且看上去更简洁了。
    我的这种用法对吧,以后在作线程的时候可不可以提倡用这种方法。
    class  wjggai  extends  Thread  implements  Runnable    
    {  
     
         public  void  run()  
               {  
                     for  (int  i=0;i  <=3;i++)  
                           {  
                                 System.out.println(  "我是一个学生!  ");  
                                   try  
                                       {  
                                             sleep(3000);  
                                   }  
                                 catch(InterruptedException  e){}  
                           
                           }  
               }  
                 
       public  static  void  main(String  args[])  
               {      
                     wjggai  w1=new  wjggai();  
                       w1.start();  
               }  
    }