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();
}
}