java多執行緒之Runnable同時執行同一資源例項
阿新 • • 發佈:2019-01-23
這是個賣票例項,採用多執行緒,模擬不同視窗來賣票,票數是共同資源。
piao.java
package tong; public class piao implements Runnable { private static int count = 10; @Override public void run() { while (count > 0) { try { Thread.sleep(23); } catch (InterruptedException e) {// TODO Auto-generated catch block e.printStackTrace(); } synchronized (this) { if (count > 0) { count--; System.out.println(Thread.currentThread().getName() + "賣出一張票,票還剩" + count); } } } } }
chuangkou.java
package tong; public class chuangkou { public static void main(String[] args) { piao piao =new piao(); Thread thread1 =new Thread(piao,"視窗1"); Thread thread2 =new Thread(piao,"視窗2"); Thread thread3 =new Thread(piao,"視窗3"); Thread thread4 =new Thread(piao,"視窗4"); thread1.start(); thread2.start(); thread3.start(); thread4.start(); } }
開啟四個視窗同時賣票,結果如下
視窗4賣出一張票,票還剩9
視窗1賣出一張票,票還剩8
視窗2賣出一張票,票還剩7
視窗3賣出一張票,票還剩6
視窗2賣出一張票,票還剩5
視窗1賣出一張票,票還剩4
視窗3賣出一張票,票還剩3
視窗4賣出一張票,票還剩2
視窗4賣出一張票,票還剩1
視窗1賣出一張票,票還剩0
多執行緒Runnable同時執行同一資源,必須考慮程式碼的原子性,對於初學者來說,執行緒訪問的隨機性,以及資源的分配有時分不清,初學者學一下java的原子性,可見性,有序性。就對這些問題清清楚楚了。
還有第一個程式piao.java,大家考慮兩個問題
第一:把if (count>0){}去掉的結果
視窗3賣出一張票,票還剩9 視窗2賣出一張票,票還剩8 視窗1賣出一張票,票還剩7 視窗4賣出一張票,票還剩6 視窗4賣出一張票,票還剩5 視窗3賣出一張票,票還剩4 視窗2賣出一張票,票還剩3 視窗1賣出一張票,票還剩2 視窗3賣出一張票,票還剩1 視窗1賣出一張票,票還剩0 視窗2賣出一張票,票還剩-1 視窗4賣出一張票,票還剩-2 視窗3賣出一張票,票還剩-3
這個是思考執行緒的控制
第二:保持第一步。然後把synchronized改成把while(count>0)括住
視窗1賣出一張票,票還剩9
視窗1賣出一張票,票還剩8
視窗1賣出一張票,票還剩7
視窗1賣出一張票,票還剩6
視窗1賣出一張票,票還剩5
視窗1賣出一張票,票還剩4
視窗1賣出一張票,票還剩3
視窗1賣出一張票,票還剩2
視窗1賣出一張票,票還剩1
視窗1賣出一張票,票還剩0
這個是思考原子性的範圍