这是运行的结果,很困惑!!!!  为什么最后一条语句输出是1000?? 我的分析应该是2000。
请各位指教谢谢 !!!!!!
tt  b = 1000
tt1  b = 1000
main  1000
main  1000/**
 * 
 * 
 */
public class SychronizeTest implements Runnable {
int b = 100; public synchronized void m1() throws InterruptedException { b = 1000;
Thread.sleep(5000);
System.out.println(Thread.currentThread().getName() + "  b = " + b); } public void run() {
try {
m1();
} catch (InterruptedException e) { e.printStackTrace();
} } public synchronized void m2() { try {
b = 2000;
// System.out.println(b);//这里输出 2000 为什么最后一条语句输出是1000??
Thread.sleep(6000); } catch (InterruptedException e) { e.printStackTrace();
}
} /**
 * 功能:
 * 
 * @param args
 * @throws InterruptedException
 */
public static void main(String[] args) throws InterruptedException { SychronizeTest t = new SychronizeTest();
SychronizeTest t1 = new SychronizeTest();
Thread tt = new Thread(t, "tt");
Thread tt1 = new Thread(t1, "tt1"); tt.start();
tt1.start(); t1.m2(); Thread.sleep(6500);
System.out.println(Thread.currentThread().getName() + "  " + t.b); System.out.println(Thread.currentThread().getName() + "  " + t1.b);
}}

解决方案 »

  1.   

    你的程序一共有三个线程,main,tt,tt1,问题就比较复杂:
    tt线程不影响结果,这里就不说了
    关键就在于:
    tt1.start()并不会使得tt1线程马上运行而先运行t1.m1()
    程序从main线程开始,语句顺序:
    1...tt1.start()   [main]
        但是,tt1.start()只是让tt1线程处于"就绪"状态,并没有获得CPU而不会运行,CPU还是main在"占着"2....t1.m2()     [main]
        这时t1.b=20003....Thread.sleep(6500);   [main]
        这时main线程退出CPU,tt1线程获得cpu而执行tt1.run从而4.....执行t1.m1() [tt1]
        这时t1.b=1000;5.....tt1.sleep()    [tt1]
        main获得CPU6.....System.out.println(Thread.currentThread().getName() + "  " + t1.b);
        t1.b=1000
    -----------------------
    说的复杂点的话,我觉得有可能答案是不确定的,因为main线程有可能在执行中被打断如果说main线程执行
    tt1.start();
    t1.m2();
    三行时中途不被打断
    那么方法就是上面的顺序---------
    如果说mian线程执行到tt1.start();被打断
    那么tt1线程将会在main执行t1.m2()之前获得CPU而先执行t1.m1():
    1....tt1.start();  [main]2....main线程被打断打断,tt1获得cpu3....t1.m1()    [tt1]
         这时t1.b=10004....再转回main执行   t1.m2()   [main]
         这时t1.b=20005.....System.out.println(Thread.currentThread().getName() + "  " + t1.b);  [main]
        t1.b=2000
    ------------------
    另外:java有没有规定main线程不会被打断???
      

  2.   

    具体楼主就看看<操作系统>这个书了
    要点是:
    一个CPU同一个时间只有一个线程运行
    线程的三种(四?)状态和互相转化
      

  3.   

    觉得1楼说的比较合理
    我再加点其实t1.m2()并不是比tt.start();tt1.start();后执行你可以尝试我修改的你的代码public class SychronizeTest implements Runnable { 
    int b = 100; public synchronized void m1() throws InterruptedException { b = 1000; 
    Thread.sleep(5000); 
    System.out.println(Thread.currentThread().getName() + "  b = " + b); } public void run() { 
    try { 
    System.out.println(Thread.currentThread().getName() + "-start !" );
    m1(); 
    System.out.println(Thread.currentThread().getName() + "-stop !" );
    } catch (InterruptedException e) { e.printStackTrace(); 
    } } public synchronized void m2() { try { 
    b = 2000; 
    System.out.print("here is method m2(), b=");
    System.out.println(b)
    ;[/color[color=#99CC00]]//这里输出 2000 为什么最后一条语句输出是1000?? 
    Thread.sleep(6000); } catch (InterruptedException e) { e.printStackTrace(); 

    } /** 
     * 功能: 
     *  
     * @param args 
     * @throws InterruptedException 
     */ 
    public static void main(String[] args) throws InterruptedException { SychronizeTest t = new SychronizeTest(); 
    SychronizeTest t1 = new SychronizeTest(); 
    Thread tt = new Thread(t, "tt"); 
    Thread tt1 = new Thread(t1, "tt1"); tt.start(); 
    tt1.start(); t1.m2(); Thread.sleep(6500); 
    System.out.println(Thread.currentThread().getName() + "  " + t.b); System.out.println(Thread.currentThread().getName() + "  " + t1.b); 
    } } 红色的内容是我修改的在我机子上运行的结果如下:tt-start!
    here is method m2(),b=tt1-start!
    2000
    tt   b=1000
    tt-stop!
    tt1  b=1000
    tt1-stop!
    main  1000
    main  1000其中,可以看出m2()方法被tt1.start()打断了!(蓝色内容)
      

  4.   

    [/color[color=#99CC00]]这句话多余
    蓝色的内容是tt-start!
    好像不是很看的清
      

  5.   

    m2 只被main运行一次就方法就结束了~然后main就继续执行下面的操作~其他的线程继续存在着