第一个问题:tp[i].start()只是告诉线程现在是处于可以运行的状态(就绪状态,随时准备运行,但是要根据一定的调度算法开始调度,虽然java是抢占式的运行机制,但是还有一个优先级的问题),而不是正在运行的状态。
学过操作系统,应该很容易理解这个问题,进程有阻塞,就绪,运行等几种状态,

解决方案 »

  1.   

    你实现的同步互斥不正确,public synchronized void Testing() 这个是说几个线程共享一个Testing()方法的对象时,该方法互斥,我估计是你每个线称都new了一个Testing()方法的对象,当然不会互斥了。
      

  2.   

    synchronized这个关键字是对于共享资源来说的,没有资源共享就不需要它,而且还损失效率。
      

  3.   

    第一个问题:
    Thread[] tp = new Thread[5];
    for (int i=0;i<5;i++){
    tp[i] = new Thread(new TimePrinter(3000, "Fast Guy"+i)); 
    tp[i].start(); 
    System.out.println("调用线程");
    }
    主线程活得执行时间没完,所以一直执行,可以加上Thread.sleep(0);重新分配执行时间即可。
    Thread[] tp = new Thread[5];
    for (int i=0;i<5;i++){
    tp[i] = new Thread(new TimePrinter(3000, "Fast Guy"+i)); 
    tp[i].start(); 
    Thread.sleep(0);
    System.out.println("调用线程");
    }
      

  4.   

    第二个问题:(修改)
    Thread[] tp = new Thread[5];
    TimePrinter tpInstance=new TimePrinter(3000, "Fast Guy");
    for (int i=0;i<5;i++){
    tp[i] = new Thread(tpInstance); 
    tp[i].start(); 
    System.out.println("调用线程");
    }
    这样的话就同步了,只有一个TimePrinter实例。线程有5个。但是好像不知怎样才能区分线程的名字
      

  5.   

    这样的话就同步了,只有一个TimePrinter实例。线程有5个。但是好像不知怎样才能区分线程的名字还是可以区分线程名字的在线程的执行路径中写:System.out.println(Thread.currentThread().toString());