Java多线程示例:4个售票员卖1000张火车票
Java多线程示例:4个售票员卖1000张火车票
- //售票员
- import java.util.Iterator;
- import java.util.Map;
- public class TicketSaler implements Runnable {
- private Map<String, Boolean> ticketMap; //票池
- private String salerName; //售票员姓名
- public TicketSaler(Map<String, Boolean> ticketMap, String salerName){
- this .ticketMap = ticketMap;
- this .salerName = salerName;
- }
- //售票
- private 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 );
- }
- }else {
- break ;
- }
- }
- }
- }
- public void run() {
- saleTicket();
- }
- }
- //售票员控制台
- import java.util.HashMap;
- import java.util.Map;
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- public class TicketSalerConsole {
- /** 功能说明:
- * @param args
- * @author 胡海
- * @since 2011-11-16 下午11:45:55
- */
- public static void main(String[] args) {
- Map ticketMap = new HashMap<String, Boolean>(); //票池:<票编号,是否已出售>
- for ( int i = 1 ; i <= 1000 ; i++){ //生成1000张火车票到票池
- ticketMap.put("T" + i, false );
- }
- //生成4名售票员
- TicketSaler s1 = new TicketSaler(ticketMap, "S1" );
- TicketSaler s2 = new TicketSaler(ticketMap, "S2" );
- TicketSaler s3 = new TicketSaler(ticketMap, "S3" );
- TicketSaler s4 = new TicketSaler(ticketMap, "S4" );
- Thread t1 =new Thread(s1);
- Thread t2 =new Thread(s2);
- Thread t3 =new Thread(s3);
- Thread t4 =new Thread(s4);
- t1.setName("T1" );
- t2.setName("T2" );
- t3.setName("T3" );
- t4.setName("T4" );
- ExecutorService service = Executors.newCachedThreadPool();
- service.execute(t1);
- service.execute(t2);
- service.execute(t3);
- service.execute(t4);
- service.shutdown();//执行完线程池中的线程后尽快退出
- }
- }