演示线程不考虑完全的逻辑问题。例如50=20+20+5+5或50=10+10+20+5等其他情况。。。本例子在判断50找零的时候,只判断了这两种情况,其他的就没考虑的。重在演示线程的过程。。。。
- packagecc.nothing2012.blogServlet;
- importjava.util.ArrayList;
- importjava.util.List;
- /*=======题目:模仿例8-10,设计5个人排队买票,并规定卖票规则和排队顺序==========*/
- /*
- *模拟五个人排队买票,每人买1张票。售票员有1张20元和1张5元的钱,电影票一张5元。
- *排队从头到尾的顺序是:关五十、林二十、余五、李十、杨五
- *最后的买票顺序是:余五、李十、林二十、关五十、杨五
- */
- publicclassch8_4{
- publicstaticList<String>theResult=newArrayList<String>();//存放最后买票先后的结果
- publicstaticvoidmain(String[]args){
- String[]sName={"关五十","林二十","余五","李十","杨五"};
- Cinemac=newCinema(sName);
- Thread[]theads={newThread(c),newThread(c),newThread(c),
- newThread(c),newThread(c)};
- //for(inti=0;i<5;i++){//初始化5个进程
- //theads[i]=newThread(c);
- //}
- for(inti=0;i<5;i++){
- theads[i].setName(sName[i]);
- }
- for(inti=0;i<5;i++){
- theads[i].start();
- }
- while(true){//将最后结果进行打印
- try{
- Thread.sleep(1000);
- }catch(InterruptedExceptione){
- e.printStackTrace();
- }
- if(theResult!=null){
- if(theResult.size()==5){
- printMessage("最后买票先后的结果");
- for(inti=0;i<5;i++){
- System.out.print(theResult.get(i)+"/t");
- }
- break;
- }
- }
- }
- }
- //负责打印信息。
- publicstaticvoidprintMessage(Objecto){
- System.out.println(o);
- }
- }
- //=======================
- classCinemaimplementsRunnable{
- TicketSellerseller;
- String[]sName;
- publicCinema(String[]sName){
- seller=newTicketSeller();
- this.sName=sName;
- }
- publicvoidrun(){
- if(Thread.currentThread().getName().equals(sName[0])){
- seller.sellTicket(50);
- }elseif(Thread.currentThread().getName().equals(sName[1])){
- seller.sellTicket(20);
- }elseif(Thread.currentThread().getName().equals(sName[2])){
- seller.sellTicket(5);
- }elseif(Thread.currentThread().getName().equals(sName[3])){
- seller.sellTicket(10);
- }elseif(Thread.currentThread().getName().equals(sName[4])){
- seller.sellTicket(5);
- }
- }
- }
- //============售票员卖票的操作==============
- classTicketSeller{
- intfiveNumber=1,tenNumber=0,twentyNumber=1,fiftyNumber=0;//小票员现有5元和20元的钱各一张
- publicsynchronizedvoidsellTicket(intreceiveMoney){
- StringsName=Thread.currentThread().getName();
- if(receiveMoney==5){//票一张是5元,刚好5元就直接卖给他,不用找零了。
- fiveNumber+=1;
- ch8_4.printMessage(sName+"给小票员5元钱,小票员卖个"+sName+"一张票不用找赎");
- ch8_4.theResult.add(sName);
- }elseif(receiveMoney==10){
- while(fiveNumber<1){
- ch8_4.printMessage(sName+"给售票员10元");
- ch8_4.printMessage("小票员请"+sName+"靠边等一会");
- try{
- wait();
- }catch(InterruptedExceptione){
- e.printStackTrace();
- }
- ch8_4.printMessage(sName+"结束等待,继续买票");
- }
- //有零钱了
- fiveNumber=fiveNumber-1;
- tenNumber+=1;
- ch8_4.printMessage(sName+"给售票员10元钱,售票员卖给"+sName+"一张票,找赎5元");
- ch8_4.theResult.add(sName);
- }elseif(receiveMoney==20){
- while(fiveNumber<1||tenNumber<1){
- ch8_4.printMessage(sName+"给售票员20元/n售票员请"+sName+"靠边等一会儿");
- try{
- wait();
- }catch(InterruptedExceptione){
- 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);
- }elseif(receiveMoney==50){
- Stringflag="";
- //booleanisOK=true;
- while(true){
- if(fiveNumber>0){//45块的组合有两种情况
- if(twentyNumber==2){
- flag="2twenty";
- break;
- //isOK=false;
- }elseif(twentyNumber==1&&tenNumber==2){
- flag="1twenty";
- //isOK=false;
- break;
- }
- }
- ch8_4.printMessage(sName+"给售票员50元/n售票员请"+sName+"靠边等一会儿");
- try{
- wait();
- }catch(InterruptedExceptione){
- e.printStackTrace();
- }
- ch8_4.printMessage(sName+"结束等待,继续买票");
- }
- if(flag.endsWith("2twenty")){
- fiveNumber-=1;
- twentyNumber=twentyNumber-2;
- fiftyNumber+=1;
- }elseif(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元
最后最票先后的结果
余五李十林二十杨五关五十