1、
public class Runnable1_ex (extends Thread) implements Runnable 
不知道怎么编译过去的,反正一个括号都不要有2、
第1个程序线程是3啊,一个main,以及th1,th2
第2个程序线程是5,一个main,以及th1,th2,ru1,ru2

解决方案 »

  1.   

    2.因为getName()是Thread类的方法,所以不加extends Thread编译不过去。线程都是3。
      

  2.   

    结果怎么五花八门的?
    大家用的都是那个版本的jdk?
    我用的是j2sdk1.4.1_03 ,执行的结果是
    第一个程序线程数为:4
    第二个线程数是:6
    真把我搞晕了!大家还是试一试这两个程序吧
      

  3.   

    你是怎么运行的我在jcreator和cmd下都是3和5是不是在其他环境里还有个线程在运行
      

  4.   

    第二个程序要继承Thread,否则不能编译
    用J2SDK1.4.1_06在CMD下,分别为3,5
    另外我用eclipse也运行了一下,分别为4和6,请问高人是不是eclipse也把自己的运行的线程也算进去了?我这么理解对吗?没学过虚拟机方面的知识,请教了
      

  5.   

    应该是eclipse自己也起了个线程
    所以不是3,5就是4,6
    总之不应该都是3会不会有其他变数真不知道
      

  6.   

    我用的是win2000 professional 在cmd下执行的,jcreator下也是这个结果。
    这与操作系统有关系吗?还有个问题,通过继承Thread类和实现Runnable接口来创建线程有什么不同吗?既然这两个程序都需要继承Thread类,为什么还要用实现Runnable接口的方式?
      

  7.   

    第一个问题很郁闷第二问题是这样:
    实际上Runnable1_ex这个类不一定要继承thread的,因为你程序中用到了thread的getName方法,所以需要继承。1、如果你将getName的语句去掉,同时不继承Thread,你会发现程序可以正常运行。
    此时由于Runnable1_ex不再是个线程类,所以
    Runnable1_ex ru1=new Runnable1_ex('A');
    后,ru1不是线程对象(不能ru1.start()),必须通过Thread th1=new Thread(ru1);
    建立th1线程对象后才能启动这个时候,应该只有3个线程了(main、th1、th2)2、如果你不将getName的语句去掉,同时继承thread
    此时由于Runnable1_ex是个线程类,所以
    Runnable1_ex ru1=new Runnable1_ex('A');
    后,ru1是线程对象(可以直接ru1.start())Thread th1=new Thread(ru1);
    th1也是线程对象这个时候,应该有5个线程了(main、th1、th2,ru1,ru2)至于多出来的线程真不知道是哪来的:(
      

  8.   

    至于为什么要有继承和接口两种方法,和java的单重继承有关如果你的类要继承其他类就不能再继承Thread了,此时需要用接口实现。
      

  9.   

    想看多出来的线程是什么?很简单,加上这么一条语句:Thread.currentThread().getThreadGroup().list();估计都是使用的集成开发环境加上去的,比如IDEA 4.5会加上这么个东西:
    <<
    java.lang.ThreadGroup[name=main,maxpri=10]
        Thread[main,5,main]
        Thread[Monitor Ctrl-Break,5,main]  <--- 喏,被新加上的。。
    >>