public class TT implements Runnable {
int b = 100;
public synchronized void m1() throws Exception{
b = 1000;
Thread.sleep(5000);
System.out.println("b = " + b);
}
public synchronized void m2() throws Exception {
Thread.sleep(2500);
b = 2000;
}
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);
}
}
[code=java][/code]
想問為什么在t.start()那里開啟執行緒的時候不會先鎖住執行m1()而是先執行主函式里的tt.m2()然后鎖住執行m2()。
uj5u.com熱心網友回復:
start不保證執行緒一定能馬上啟動的(執行緒的啟動是隨機的)你可以在tt.m2前追加Thread.sleep讓主線等一會,以保證t啟動后再去呼叫tt.m2
uj5u.com熱心網友回復:
先感謝您的回答,這個我試過了 是先啟動執行緒。
不加sleep的時候,每次都是先鎖m2才會鎖m1.還是我試的次數太少了
uj5u.com熱心網友回復:
你像我這樣寫就會得到你期望的結果,你是不是想先調m1再調m2
public static void main(String[] args) throws Exception {
TT tt = new TT();
Thread t = new Thread(tt);
t.start();
t.join();
tt.m2();
System.out.println(tt.b);
}
uj5u.com熱心網友回復:
那應該是測驗次數太少了,隨機性沒體現出來你可以用個while回圈多測驗看看
while(true) {
TT tt = new TT();
Thread t = new Thread(tt);
t.start();
tt.m2();
System.out.println(tt.b);
if(tt.b==2000) break; //如果m2后呼叫就退出回圈
}
uj5u.com熱心網友回復:
謝謝 我只是想知道為什么每次試都是先呼叫m2
uj5u.com熱心網友回復:
好的 等會試試
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/206018.html
標籤:Java相關
