为什么出来是:3 完成
1 完成
2 完成
class One {       
  synchronized void display(int num)  { 
    try {
      System.out.print(""+num);
         Thread.sleep(1000); 
    }
    catch(InterruptedException e)  {
      System.out.println("中断");
    }
    System.out.println(" 完成");
  }
}
class Two implements Runnable {
  int number; 
  One one;
  Thread t;
  public Two(One one_num, int n)   {
    one = one_num;
    number = n;
    t=new Thread(this);
    t.setPriority(n);
    t.start();
  }
  public void run() {
    one.display(number);
  }
}
public class Sample08Synchronized {
  public static void main(String args[]) {
    try {
      One one=new One();
      int digit=1;
      Two s1=new Two(one,digit++);
      Two s2=new Two(one,digit++);
      Two s3=new Two(one,digit++);
      s1.t.join();
      s2.t.join();
      s3.t.join();
    }
    catch(InterruptedException ie) {
      System.out.println("线程意外终止");
    }
  }
}

解决方案 »

  1.   

    因为1最先运行  ,你把 s1.t.join();
          s2.t.join();
          s3.t.join();顺序改一下,得到的结果会不一样吧
      

  2.   


    而java虚拟机是不支持时间片的,只支持剥夺的方式,但是操作系统支持那么他在优先级等同的情况下那么机制就随操作系统。在win下也有线程的优先级,如果线程优先级不一样的情况下,是否低优先级就得不到执行呢?答案是否定的,也就是说为什么你的程序为什么先出3,而下次出1了,最后才出2的情况。显然优先级最高的是3,但是1是最先进入等待状态的,但是等main的线程时间片结束后,3的优先级最高,所以s3执行,s3的时间片到期后,等待的线程有s1,和s2,这里s1是最先等待的,虽然优先级别比s2低1级,但是低优先级的线程通用有机会获取运行状态,这里他就得到了执行,所以出的是1,最后是2。至于低优先级是如何获取运行的时刻,我们就不必理会,知道就行。你可以做一个实验:把代码这样改一下就知道了。
          Two s1=new Two(one,1);
          Two s2=new Two(one,3);
          Two s3=new Two(one,5);