示例:
三個窗口同時出售20張票。
程序分析:
1、票數要使用一個靜態的值。
2、為保證不會出現賣出同一張票,要使用同步鎖。
3、設計思路:創建一個站台類Station,繼承THread,重寫run方法,在run方法內部執行售票操作!
售票要使用同步鎖:即有一個站台賣這張票時,其他站台要等待這張票賣完才能繼續賣票!
package com.multi_thread; //站台類 public class Station extends Thread { // 通過構造方法給線程名字賦值 public Station(String name) { super(name);// 給線程起名字 } // 為了保持票數的一直,票數要靜態 static int tick = 20; // 創建一個靜態鑰匙 static Object ob = "aa";// 值是任意的 @Override public void run() { while (tick > 0) { // 這個很重要,必須使用一個鎖,進去的人會把鑰匙拿在手上,出來后把鑰匙讓出來 synchronized (ob) { if (tick > 0) { System.out.println(getName() + "賣出了第" + tick + "張票"); tick--; } else { System.out.println("票賣完了"); } } try { // 休息一秒鍾 sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }
package com.multi_thread; public class MainClass { // java多線程同步所的使用 // 三個售票窗口同時出售10張票 public static void main(String[] args) { // 實例化站台對象,並為每一個站台取名字 Station station1 = new Station("窗口1"); Station station2 = new Station("窗口2"); Station station3 = new Station("窗口3"); // 讓每一個站台對象各自開始工作 station1.start(); station2.start(); station3.start(); } }
程序運行結果:
窗口1賣出了第20張票
窗口3賣出了第19張票
窗口2賣出了第18張票
窗口2賣出了第17張票
窗口3賣出了第16張票
窗口1賣出了第15張票
窗口1賣出了第14張票
窗口3賣出了第13張票
窗口2賣出了第12張票
窗口1賣出了第11張票
窗口3賣出了第10張票
窗口2賣出了第9張票
窗口1賣出了第8張票
窗口3賣出了第7張票
窗口2賣出了第6張票
窗口1賣出了第5張票
窗口3賣出了第4張票
窗口2賣出了第3張票
窗口3賣出了第2張票
窗口1賣出了第1張票