示範線程不考慮完全的邏輯問題。例如50=20+20+5+5或50=10+10+20+5等其他情況。。。本例子在判斷50找零的時候,只判斷了這兩種情況,其他的就沒考慮的。重在示範線程的過程。。。。
Code:
- package cc.nothing2012.blogServlet;
-
- import java.util.ArrayList;
- import java.util.List;
-
- /*=======題目:模仿例8-10,設計5個人排隊買票,並規定賣票規則和排隊順序==========*/
-
- /*
- * 類比五個人排隊買票,每人買1張票。售票員有1張20元和1張5元的錢,電影票一張5元。
- * 排隊從頭到尾的順序是:關五十、林二十、餘五、李十、楊五
- * 最後的買票順序是:餘五、李十、林二十、關五十、楊五
- */
- public class ch8_4 {
- public static List<String> theResult = new ArrayList<String>(); // 存放最後買票先後的結果
-
- public static void main(String[] args) {
- String[] sName = { "關五十", "林二十", "餘五", "李十", "楊五" };
- Cinema c = new Cinema(sName);
- Thread[] theads = { new Thread(c), new Thread(c), new Thread(c),
- new Thread(c), new Thread(c) };
- // for(int i=0;i<5;i++){ //初始化5個進程
- // theads[i]=new Thread(c);
- // }
- for (int i = 0; i < 5; i++) {
- theads[i].setName(sName[i]);
- }
- for (int i = 0; i < 5; i++) {
- theads[i].start();
- }
-
- while (true) {// 將最後結果進行列印
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- if (theResult != null) {
- if (theResult.size() == 5) {
- printMessage("最後買票先後的結果");
- for (int i = 0; i < 5; i++) {
- System.out.print(theResult.get(i) + "/t");
- }
- break;
- }
- }
- }
- }
-
- // 負責列印資訊。
- public static void printMessage(Object o) {
- System.out.println(o);
- }
- }
-
- // =======================
- class Cinema implements Runnable {
- TicketSeller seller;
- String[] sName;
-
- public Cinema(String[] sName) {
- seller = new TicketSeller();
- this.sName = sName;
- }
-
- public void run() {
- if (Thread.currentThread().getName().equals(sName[0])) {
- seller.sellTicket(50);
- } else if (Thread.currentThread().getName().equals(sName[1])) {
- seller.sellTicket(20);
- } else if (Thread.currentThread().getName().equals(sName[2])) {
- seller.sellTicket(5);
- } else if (Thread.currentThread().getName().equals(sName[3])) {
- seller.sellTicket(10);
- } else if (Thread.currentThread().getName().equals(sName[4])) {
- seller.sellTicket(5);
- }
- }
-
- }
-
- // ============售票員賣票的操作==============
- class TicketSeller {
- int fiveNumber = 1, tenNumber = 0, twentyNumber = 1, fiftyNumber = 0; // 小票員現有5元和20元的錢各一張
-
- public synchronized void sellTicket(int receiveMoney) {
- String sName = Thread.currentThread().getName();
- if (receiveMoney == 5) { // 票一張是5元,剛好5元就直接賣給他,不用找零了。
- fiveNumber += 1;
- ch8_4.printMessage(sName + "給小票員5元錢,小票員賣個" + sName + "一張票不用找贖");
- ch8_4.theResult.add(sName);
- } else if (receiveMoney == 10) {
- while (fiveNumber < 1) {
- ch8_4.printMessage(sName + "給售票員10元");
- ch8_4.printMessage("小票員請" + sName + "靠邊等一會");
- try {
- wait();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- ch8_4.printMessage(sName + "結束等待,繼續買票");
- }
- // 有零錢了
- fiveNumber = fiveNumber - 1;
- tenNumber += 1;
- ch8_4.printMessage(sName + "給售票員10元錢,售票員賣給" + sName + "一張票,找贖5元");
- ch8_4.theResult.add(sName);
- } else if (receiveMoney == 20) {
- while (fiveNumber < 1 || tenNumber < 1) {
- ch8_4.printMessage(sName + "給售票員20元/n售票員請" + sName + "靠邊等一會兒");
- try {
- wait();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- ch8_4.printMessage(sName + "結束等待,繼續買票");
- }
- fiveNumber = fiveNumber - 1;
- tenNumber = tenNumber - 1;
- twentyNumber += 1;
- ch8_4.printMessage(sName + "給售票員20元錢,售票員賣給" + sName + "一張票,找零15元");
- ch8_4.theResult.add(sName);
- } else if (receiveMoney == 50) {
- String flag = "";
- // boolean isOK=true;
- while (true) {
- if (fiveNumber > 0) { // 45塊的組合有兩種情況
- if (twentyNumber == 2) {
- flag = "2twenty";
- break;
- // isOK=false;
- } else if (twentyNumber == 1 && tenNumber == 2) {
- flag = "1twenty";
- // isOK=false;
- break;
- }
- }
- ch8_4.printMessage(sName + "給售票員50元/n售票員請" + sName + "靠邊等一會兒");
- try {
- wait();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- ch8_4.printMessage(sName + "結束等待,繼續買票");
- }
- if (flag.endsWith("2twenty")) {
- fiveNumber -= 1;
- twentyNumber = twentyNumber - 2;
- fiftyNumber += 1;
- } else if (flag.equals("1twenty")) {
- fiveNumber = fiveNumber - 1;
- tenNumber = tenNumber - 2;
- twentyNumber = twentyNumber - 1;
- }
- ch8_4.printMessage(sName + "給售票員50元錢,售票員賣給" + sName + "一張票,找零45元");
- ch8_4.theResult.add(sName);
- }
- notifyAll();
- }
- }
運行結果如下:
關五十給售票員50元
售票員請關五十靠邊等一會兒
林二十給售票員20元
售票員請林二十靠邊等一會兒
餘五給小票員5元錢,小票員賣個餘五一張票不用找贖
關五十結束等待,繼續買票
關五十給售票員50元
售票員請關五十靠邊等一會兒
林二十結束等待,繼續買票
林二十給售票員20元
售票員請林二十靠邊等一會兒
李十給售票員10元錢,售票員賣給李十一張票,找贖5元
關五十結束等待,繼續買票
關五十給售票員50元
售票員請關五十靠邊等一會兒
林二十結束等待,繼續買票
林二十給售票員20元錢,售票員賣給林二十一張票,找零15元
關五十結束等待,繼續買票
關五十給售票員50元
售票員請關五十靠邊等一會兒
楊五給小票員5元錢,小票員賣個楊五一張票不用找贖
關五十結束等待,繼續買票
關五十給售票員50元錢,售票員賣給關五十一張票,找零45元
最後最票先後的結果
餘五 李十 林二十 楊五 關五十