public class TT1 implements Runnable { 
  int b = 100; 
  
  public synchronized void m1() throws Exception { 
      b = 1000;          (6)  
      Thread.sleep(5000);  (7)  // 这里程序阻塞 5000毫秒 
      System.out.println("b = " + b);  (12) 
  } 
    
  public synchronized void m2() throws Exception  { 
    Thread.sleep(2500);  (9)  // m2方法阻塞2500毫秒! 
    b = 2000;  (10)  // 因为阻塞时间 2500 <5000 所以 这个先自动释放,并执行 
  } 
  
  public void run() {    (4) //程序走run 方法 
    try { 
      m1();            (5)  // 调用m1()方法 
    } catch(Exception e)  { 
      e.printStackTrace(); 
    } 
  } 
  
  public static void main(String[] args) throws Exception  { 
    TT1 tt = new TT1();  (1) 
    Thread t = new Thread(tt);  (2) 
    t.start();    (3)  //启动线程 
  
    tt.m2();  (8)  // 因为m1线程阻塞, main方法也是个线程,它继续执行,调用m2方法 
    
    System.out.println(tt.b);  (11)  
  } 
  

 前天有个人贴了段程序在论坛上,我运行了一下结果是
2000
b=1000 可为什么别人说答案是
1000
b=1000 
 
有没有谁和我结果一样的!

解决方案 »

  1. 这个程序跟你机器有关系,主要是 主线程main 和 线程t 之间的关系
      

  2. 一般情况下
        t.start();    (3)  //启动线程
     
        tt.m2();  第二个的运行应该更优先一点,毕竟是下一个语句,而线程的start是需要一点时间的。不过,并不排除第一个拿到了cpu并被执行了。
      

aliyun

类似问题 »