多线程售票管理系统(多线程)

 

1.WindowsTicket类

package com.hubstc.muitthread;

import java.util.Iterator;
import java.util.Map;
/*
 * 售票窗口类,每个窗口包含一名售票员和一个售票池
 */
public class WindowsTicket implements Runnable {
    private Map<String, Boolean> ticketMap;   //票池
    private String salerName;                //售票员姓名
    
    //构造方法
    public WindowsTicket(Map<String, Boolean> ticketMap,String salerName){
        this.ticketMap = ticketMap;
        this.salerName = salerName;
    }
    
    //售票
    public void saleTicket() {
        //遍历循环票池,判断该票是否存在
        for(Iterator<String> it = ticketMap.keySet().iterator();;)
            //采用同步锁是为了避免线程同时被其他线程执行导致数据错误
            //但是被锁定的资源一定要是共享资源
        synchronized (ticketMap) {
            if(it.hasNext()) {//如果存在,则取出该票
                String ticketNo = it.next();
                if(!ticketMap.get(ticketNo)) {//默认该票号未被售出
                    System.out.println(salerName+":"+ticketNo+"已被售出!");
                    ticketMap.put(ticketNo,true);  //将售出票号存放到票池
                    
                    try {
                        //让当前线程休息一秒,使得其他线程有机会执行
                        Thread.sleep(1000); 
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }            
            }
            else {
                break;            
            }
        }            
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        saleTicket();
    }    
}
2.TestTicket类

package com.hubstc.muitthread;

import java.util.HashMap;
import java.util.Map;
/*
 * 售票大厅,开设4个窗口。每个线程建立一个线程,独立售票
 */
public class TestTicket {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //票池:<票编号,是否已售出>
        Map ticketMap = new HashMap<String, Boolean>();
        
        //随机生成1000张火车票到票池
        for(int i = 1; i <= 1000;i++) {
            ticketMap.put("T"+i, false); //默认票号未被售出
        }
        
        //创建四个售票窗口
        WindowsTicket s1 = new WindowsTicket(ticketMap,"张三");
        WindowsTicket s2 = new WindowsTicket(ticketMap,"李四");
        WindowsTicket s3 = new WindowsTicket(ticketMap,"王五");
        WindowsTicket s4 = new WindowsTicket(ticketMap,"赵六");
        
        //每个窗口建立一个线程
        Thread t1 = new Thread(s1);
        Thread t2 = new Thread(s2);
        Thread t3 = new Thread(s3);
        Thread t4 = new Thread(s4);
        
        //启动线程
        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值