日期:2014-05-20  浏览次数:20637 次

和线程相关的问题。。。新手求助
public class TT implements Runnable {
int b = 100;

public synchronized void m1() throws Exception{

Thread.sleep(1);
b = 1000;

System.out.println("b = " + b);
}

public synchronized void m2() throws Exception {
Thread.sleep(2500);
b = 2000;
System.out.println("m2.b = "+b);
}

public void run() {
try {
m1();
} catch(Exception e) {
e.printStackTrace();
}
}

public static void main(String[] args) throws Exception {
TT tt = new TT();
Thread t = new Thread(tt);
t.start();

tt.m2();
System.out.println(tt.b);
Thread.sleep(15000);
System.out.println(tt.b);
}
}






输出的结果是
m2.b = 2000
2000
b = 1000
1000
不明白为什么m2.b = 2000是第一个输出,已经用了sleep方法让它睡眠了2500毫秒,觉得第一个应该不是它 啊。这意思是比m1方法中先醒吗?求解释啊

------解决方案--------------------
 TT tt = new TT();
        Thread t = new Thread(tt);
        t.start();
        Thread.sleep(1);
        tt.m2();
        System.out.println(tt.b);
        Thread.sleep(15000);
        System.out.println(tt.b);



main在线程启动后加上一个Thread.sleep(1)

输出结果就是
b = 1000
m2.b = 2000
2000
2000

Process finished with exit code 0


原因是cpu资源分配的问题吧 
可能优先分配给当前线程
然后再分配给子线程
如果加上sleep的话 当前主线程cpu资源释放
所以子线程会立刻得到资源 从而执行 m1();

但是你之前写的代码里面,也不是一定会先执行 m2 再执行m1的   多跑几次就会有差异的
------解决方案--------------------
1、要确定有多少个线程,一个是t,一个main。
2、然后确定共享资源是什么:对象tt。

现在来确定下打印顺序的问题:
t.start();//这个是t线程执行
tt.m2();//这个是main线程执行,方法里的sleep(2500),是指main线程睡2.5s

两个线程,谁先执行?谁都不知道,只有CPU资源分配时才知道哪个线程先执行。
不过假设:  情况1、t先执行,那t执行到m1();的时候,就获得了共享资源tt的锁,main线程等待。
            情况2、main先执行,那main执行到m2();的时候,就获得了共享资源tt的锁,t线程等待。
情况1成立,那打印出来的就是:b=1000 (睡2.5s) m2.b=2000 2000 (睡15s)  2000
情况2成立,那打印出来的就是:(睡2.5s)m2.b=2000 2000 (睡15s)  b=1000 1000