1、購票(不安全策略)
**片段:
public class main catch (exception e) }}
};new thread(r).start();
new thread(r).start();
new thread(r).start();
new thread(r).start();
}}
顯示結果:
賣出了一張票,還剩下6張票
賣出了一張票,還剩下5張票
賣出了一張票,還剩下5張票
賣出了一張票,還剩下5張票
賣出了一張票,還剩下2張票
賣出了一張票,還剩下2張票
賣出了一張票,還剩下2張票
賣出了一張票,還剩下2張票
賣出了一張票,還剩下0張票
賣出了一張票,還剩下0張票
2、購票(安全策略)
**片段:
public class main catch (exception e) }}
};new thread(r).start();
new thread(r).start();
new thread(r).start();
new thread(r).start();
}}
顯示結果:
賣出了一張票,還剩下9張票
賣出了一張票,還剩下8張票
賣出了一張票,還剩下7張票
賣出了一張票,還剩下6張票
賣出了一張票,還剩下5張票
賣出了一張票,還剩下4張票
賣出了一張票,還剩下3張票
賣出了一張票,還剩下2張票
賣出了一張票,還剩下1張票
賣出了一張票,還剩下0張票
注:第乙個執行緒進入run()後,其他程序無法進入,直到第乙個執行緒執行完畢才允許其他程序進入,而此時ticket已經為0,其他程序不能進入迴圈體,因此,退出。
其中,形如
synchronized (main.class) {}包含**塊的結構也能達到同樣的效果。
3、wait()和notify()
**片段:
public class main catch (interruptedexception e)
system.out.println("t1 end!");}}
}.start();
new thread()
}}.start();
}}
結果顯示:
t1 start!
t2 start!
t2 end!
t1 end!
wait()方法可以使執行緒進入等待狀態,而notify()可以使等待的狀態喚醒。這樣的同步機制十分適合生產者、消費者模式:消費者消費某個資源,而生產者生產該資源。當該資源缺失時,消費者呼叫wait()方法進行自我阻塞,等待生產者的生產;生產者生產完畢後呼叫notify/notifyall()喚醒消費者進行消費。
4、wait()
和notify()
精細控制
**片段:
public class main catch (interruptedexception e)
system.out.println("t1 end!");}}
}.start();
new thread()
}}.start();;
new thread()
}}.start();;
new thread() catch (interruptedexception e)
system.out.println("t4 end!");}}
}.start();
}}
結果顯示:
t1 start!
t2 start!
t2 end!
t1 end!
t3 start!
t3 end!
t4 start!
很容易看出來,t4,它啟動了,但是wait了,後面已經沒有執行緒了,它的wait永遠不會有執行緒幫它notify了!於是,t4 (t4 end!沒法執行到)它就這麼等著!
Java多執行緒經典案例
1.三個售票視窗同時 20張票 public class demo1 class ticketoffice implements runnable override public void run else catch interruptedexception e 2.建立兩個執行緒,其中乙個輸出1...
Java多執行緒 執行緒通訊使用案例
執行緒通訊 wait 導致當前執行緒等待,直到其他執行緒呼叫該同步監視器的notify 方法和notifyall 方法來喚醒該執行緒 notify 喚醒在此同步監視器上等待的單個執行緒,會選擇喚醒其中的任意乙個執行緒,選擇是任意的。只有當前執行緒放棄對該同步監視器的鎖定後 呼叫wait 方法 才會執...
多執行緒死鎖案例
public class threaddeadlock implements runnable public void run else public class lockthread main方法裡測試死鎖案例 threaddeadlock t1 new threaddeadlock true t...