演示线程不考虑完全的逻辑问题。例如50=20+20+5+5或50=10+10+20+5等其他情况。。。本例子在判断50找零的时候,只判断了这两种情况,其他的就没考虑的。重在演示线程的过程。。。。
- 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元
最后最票先后的结果
余五 李十 林二十 杨五 关五十