1 public class ThreadDemo4 
2 {
3  public static void main(String[] args) 
4  {
5  ThreadTest tt=new ThreadTest();
6  new Thread(tt).start();
7  new Thread(tt).start();
8  new Thread(tt).start();
9  new Thread(tt).start();
10 }
11 }
12
13 class ThreadTest implements Runnable
14 {
15  private int tickets=100;
16  public void run()
17  {
18  while(true)
19  {
20  if(tickets>0)
21 System.out.println(Thread.currentThread().getName()+" is saling ticket "+tickets--);
22 }
23 }
24 }问:第五行只是定义了一个对象,为何6,7,8,9能启动四个线程?

解决方案 »

  1.   

    一个Thread就是一个线程啊. 只是几个线程运行的内容完全一样罢了.
      

  2.   

    Thread类简单定义如下:
    class Thread{
      private Runnable r;
      public Thread(Runnable r){
        this.r = r;
      }
      public void run(){}
      public void start(){
        if (r != null){  //用new Thread(Runnable)产生线程运行Runnable的run方法
          r.run();
        }
        else{  //用new MyThread()产生线程运行MyThread重载后的run方法
          判断Thread初始化次数的代码,
          如果未被初始化,则调用重载后的run方法
        }
      }
    }
    如上面的if...else...所示,对于new Thread(Runnable)这样构造的线程能产生多个相同的线程;而new MyThread()这样的只能启动一次,不能多次生成并启动线程.
      

  3.   

    new Thread(tt).start();
    你是定义了一个对象tt,但你的这个tt作为了构造参数.
    你连续又new出了四个不同的Thread对象.
    你的new Thread(tt).start();
    其实是连续启动了具有相同内容的四个线程
      

  4.   

    这很容易理解,你把一个对象放到4个线程“对象”里面,线程和你的对象tt没关系。你可以把多个对象放到不同的多个线程中,也可以把同一个对象放到多个线程中。这里涉及到一个资源使用的问题,多个线程共用一个资源,一次只有一个占有它,实际上线程是分时的,从你上面的程序运行结果很容易看出,实际上只有一个"tickets"被使用。这是操作系统的资源使用的问题,找本操作系统来看就很明白了。
      

  5.   

    一个Thread就是一个线程,这个线程的内容是tt。每个线程是独立运行的,所以可以有4个线程,只不过内容相同而已。