这是一个在并发状态下对共享资源的多线程访问。这些访问必须是互斥的进行,因为涉及到对资源的修改。假设现在销售火车票。目的地有3个,分别是北京,天津和上海。使用一个枚举类型表示。
Destation.java
package com.zj.tickets;
 
public enum Destation {
    BEIJINGSHANGHAITIANJING
}
下面设计车票类,final int original表示车票基数;int current表示当前还有多少张票;Destation destation表示目的地,它必须从上面的枚举型中取出其一。
Ticket.java
package com.zj.tickets;
 
public class Ticket {
    private final int original;
    private int current;
    private final Destation destation;
 
    public Ticket(int nums, Destation where) {
       current = original = nums;
       destation = where;
    }
 
    public int degress() {
       return --current;
    }
 
    public int original() {
       return original;
    }
 
    public boolean soldout() {
       return current <= 0;
    }
 
    public Destation getDestation() {
       return destation;
    }
 
    public int getCurrent() {
       return current;
    }
}
下面设计售票厅类,Map<Destation, Ticket> tickets表示目前可销售的车票种类,它通过一个static块初始化。Map<Destation, Integer> records是当前售票厅的火车票销售情况。List<BookingOffice> offices表示当前可工作的所有售票厅,每个售票厅是一个线程。int ticketsSold表示当前售票厅售出的火车票总数。int id表示当前售票厅编号。
每个线程都会模拟客户买票、工作人员查询数据库和售票交易过程。
模拟的数据为,当前发往北京、上海和天津的火车票各5张;每个售票厅交易5次(无论交易成功或失败)后关闭。
BookingOffice.java
package com.zj.tickets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.TimeUnit;
 
public class BookingOffice implements Runnable {
    private static Map<Destation, Ticket> tickets = new HashMap<Destation, Ticket>();
    private Map<Destation, Integer> records;
    private static List<BookingOffice> offices = new ArrayList<BookingOffice>();
    private int ticketsSold = 0;
    private final int id;
 
    // now today's tickets for sell:
    static {
       tickets.put(Destation.BEIJINGnew Ticket(5, Destation.BEIJING));
       tickets.put(Destation.SHANGHAInew Ticket(5, Destation.SHANGHAI));
       tickets.put(Destation.TIANJINGnew Ticket(5, Destation.TIANJING));
    }
 
    public BookingOffice(int id) {
       this.id = id;
       offices.add(this);
       resetRecords();
    }
 
    private void resetRecords() {
       records = new HashMap<Destation, Integer>();
    }
 
    private void addRecords(Destation d) {
       Integer freq = records.get(d);
       records.put(d, freq == null ? 1 : freq + 1);
    }
 
    public void run() {
       int transaction = 5;
       while (transaction-- > 0) {
           // simulate a customer's coming:
           Destation d = Destation.values()[new Random().nextInt(Destation
                  .values().length)];
           print(this + "i want a ticket for " + d);
           // simulate the officer's checking:
           try {
              TimeUnit.SECONDS.sleep(1);
           } catch (InterruptedException e) {
              e.printStackTrace();
           }
           // simulate the transaction:
           Ticket wanted = tickets.get(d);
           synchronized (wanted) {
              if (!wanted.soldout()) {
                  print(this + "sold a ticket for " + d);
                  wanted.degress();
                  addRecords(d);
                  ++ticketsSold;
                  print(this + "" + d + " tickets still have "
                         + wanted.getCurrent());
              } else
                  print(this + "tickets for " + d + " have been sold out.");
           }
       }
       print(this + "closed");
       print(this + "totally sold tickets:" + ticketsSold + ",sell records:"
              + records);
    }
 
    public synchronized int getValue() {
       return ticketsSold;
    }
 
    public String toString() {
       return "<Officce-" + id + ">";
    }
 
    static void print(String s) {
       System.out.println(s);
    }
}
模拟售票过程如下,启动5个售票厅。
Sell.java
package com.zj.tickets;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
 
public class Sell {
    public static void main(String[] args) throws Exception {
       ExecutorService exec = Executors.newCachedThreadPool();
       for (int i = 0; i < 5; i++)
           exec.execute(new BookingOffice(i));
       exec.shutdown();
    }
}
结果:
<Officce-0>i want a ticket for BEIJING
<Officce-1>i want a ticket for SHANGHAI
<Officce-2>i want a ticket for TIANJING
<Officce-3>i want a ticket for SHANGHAI
<Officce-4>i want a ticket for SHANGHAI
<Officce-0>sold a ticket for BEIJING
<Officce-0>BEIJING tickets still have 4
<Officce-0>i want a ticket for TIANJING
<Officce-1>sold a ticket for SHANGHAI
<Officce-1>SHANGHAI tickets still have 4
<Officce-1>i want a ticket for SHANGHAI
<Officce-2>sold a ticket for TIANJING
<Officce-2>TIANJING tickets still have 4
<Officce-2>i want a ticket for BEIJING
<Officce-3>sold a ticket for SHANGHAI
<Officce-3>SHANGHAI tickets still have 3
<Officce-3>i want a ticket for TIANJING
<Officce-4>sold a ticket for SHANGHAI
<Officce-4>SHANGHAI tickets still have 2
<Officce-4>i want a ticket for BEIJING
<Officce-4>sold a ticket for BEIJING
<Officce-4>BEIJING tickets still have 3
<Officce-4>i want a ticket for SHANGHAI
<Officce-3>sold a ticket for TIANJING
<Officce-3>TIANJING tickets still have 3
<Officce-3>i want a ticket for TIANJING
<Officce-2>sold a ticket for BEIJING
<Officce-2>BEIJING tickets still have 2
<Officce-2>i want a ticket for BEIJING
<Officce-1>sold a ticket for SHANGHAI
<Officce-1>SHANGHAI tickets still have 1
<Officce-1>i want a ticket for SHANGHAI
<Officce-0>sold a ticket for TIANJING
<Officce-0>TIANJING tickets still have 2
<Officce-0>i want a ticket for SHANGHAI
<Officce-4>sold a ticket for SHANGHAI
<Officce-4>SHANGHAI tickets still have 0
<Officce-4>i want a ticket for BEIJING
<Officce-3>sold a ticket for TIANJING
<Officce-3>TIANJING tickets still have 1
<Officce-3>i want a ticket for BEIJING
<Officce-2>sold a ticket for BEIJING
<Officce-2>BEIJING tickets still have 1
<Officce-2>i want a ticket for SHANGHAI
<Officce-1>tickets for SHANGHAI have been sold out.
<Officce-1>i want a ticket for SHANGHAI
<Officce-0>tickets for SHANGHAI have been sold out.
<Officce-0>i want a ticket for SHANGHAI
<Officce-4>sold a ticket for BEIJING
<Officce-4>BEIJING tickets still have 0
<Officce-4>i want a ticket for BEIJING
<Officce-3>tickets for BEIJING have been sold out.
<Officce-3>i want a ticket for BEIJING
<Officce-2>tickets for SHANGHAI have been sold out.
<Officce-2>i want a ticket for SHANGHAI
<Officce-1>tickets for SHANGHAI have been sold out.
<Officce-1>i want a ticket for BEIJING
<Officce-0>tickets for SHANGHAI have been sold out.
<Officce-0>i want a ticket for SHANGHAI
<Officce-4>tickets for BEIJING have been sold out.
<Officce-4>closed
<Officce-4>totally sold tickets:4,sell records:{BEIJING=2, SHANGHAI=2}
<Officce-3>tickets for BEIJING have been sold out.
<Officce-3>closed
<Officce-3>totally sold tickets:3,sell records:{TIANJING=2, SHANGHAI=1}
<Officce-2>tickets for SHANGHAI have been sold out.
<Officce-2>closed
<Officce-2>totally sold tickets:3,sell records:{BEIJING=2, TIANJING=1}
<Officce-1>tickets for BEIJING have been sold out.
<Officce-1>closed
<Officce-1>totally sold tickets:2,sell records:{SHANGHAI=2}
<Officce-0>tickets for SHANGHAI have been sold out.
<Officce-0>closed
<Officce-0>totally sold tickets:2,sell records:{BEIJING=1, TIANJING=1}
本文转自zhangjunhd51CTO博客,原文链接:http://blog.51cto.com/zhangjunhd/70767,如需转载请自行联系原作者

Java:多线程模拟多站点售票过程相关推荐

  1. java多线程模拟实现12306售票

    业务描述 假设有200张票,用4个线程去订票,不能有两个或者以上的线程订到了 同一个票(原因就不说了),当最后一张票卖掉的时候结束,再订就抛 异常提示出票卖完了. 业务分析 1.需要创建一个车票类,初 ...

  2. Java多线程模拟售票系统

    Java创建多线程的两种基本方法: 方法1.继承Thread类 (1)定义子类,继承Thread类,重写该类的run()方法作为线程执行体; (2)创建该子类的实例作为线程对象; (3)调用线程对象的 ...

  3. java多线程模拟购买火车票

    java多线程模拟购买火车票 本次做的是一个火车票的售卖模拟,不管用户是在窗口还是APP上购买,必然不可能买到同一张票这也就是说一张票的售卖必然是一个线程在操作的,所以,我们在写代码是也要注意这一点 ...

  4. java多线程模拟龟兔赛跑,JAVA多线程模拟龟兔赛跑

    JAVA多线程模拟龟兔赛跑! class Rabbit extends Thread{ Tortoise tor; int Journey; int RabbitSpeed; public Rabbi ...

  5. Java多线程 模拟 购买 退订 机票

     Java多线程 模拟 购买 退订 机票 package cn.com.cloud.sea.thread; /*** @author HenryLee* @version 1.0* 买票*/ publ ...

  6. 利用JAVA多线程模拟售票系统,对统一资源进行处理

    首先多线程处理统一资源的方式有两种 分别介绍一下两者的区别 synchronized与Lock的区别 1.Lock不是Java语言内置的,synchronized是Java语言的关键字 2.synch ...

  7. Java多线程 模拟售票窗口售票

    编写一个Java 多线程程序,完成三个售票窗口同时出售20张票 程序分析: 1.票数要使用同一个静态值: 2.为保证不会出现卖出同一个票数,要java多线程同步锁. 设计思路: 创建一个站台类Stat ...

  8. Java多线程模拟加工厂加工玩具

    创建工厂类, 属性包括:车间类的对象的集合,仓库容量 方法包括: 1. 加工玩具的方法(product),方法的功能是各个车间同时工作.根据仓库容量平均分配给各个车间需要加工玩具的数量.2. 建造玩具 ...

  9. Java 多线程 模拟银行ATM实时存取钱

    近期想回顾一些知识: 一.Java 多线程 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务.多线程是多任务的一种特别的形式,但多线程使用了更小的资源开 ...

最新文章

  1. python tk 获取鼠标事件_在Tkin中列出鼠标悬停事件函数
  2. 7、leetcode410 分割数组的最大值
  3. 实验0-Hive配置与启动
  4. esd管 低cj要求_TVS管与ESD保护二极管的区别,联系以及应用
  5. Angular内提供了一个可以快速建立测试用web服务的方法:内存 (in-memory) 服务器...
  6. java安全编码指南之:输入注入injection
  7. How do I get the lowest value of all the non zero value pixels?
  8. cad在线转低版本_为什么别人制图那么快?41个CAD实用技巧,3天轻松玩转CAD
  9. 小心了!这18位数字一泄漏,支付宝账户就可能会被他人盗刷!
  10. Codeforces Round #243 (Div. 1)
  11. Mac下使用gitHub
  12. SqlServer修改密码后登陆不上
  13. Java学生管理系统-增删改查
  14. Node.js 解压版 安装配置
  15. 3D游戏模型是怎么制作出来的?
  16. (轉貼) 寶蘭開發工具部門將分割成完全獨立的子公司 (C/C++) (News)
  17. MiniMap(小地图)插件
  18. 软件架构模式 mark Richards - 读后总结 1 - 分层架构
  19. win7怎么装python_如何在win7上面安装python的包
  20. slf4j简单介绍(2)-使用

热门文章

  1. BZOJ 4602: [Sdoi2016]齿轮 dfs
  2. 社会对IT 从业人员综合素质的需求
  3. linux 快组描述符,Linux 进程描述符 task struct
  4. matlab cgf sc 未定义,matlab通用神經網絡代碼
  5. php抓取网页css,php 抓取的页面如何处理可以只保留DOM结构,去掉CSS和JS?
  6. php 多字节截取,将多字节字符串截断为n个字符
  7. 7个使用JavaScript构建数据可视化的实用工具库,希望你能喜欢
  8. 零基础开始学前端有什么建议?
  9. 高响应比优先调度算法 (HRRN)例题
  10. hbase 客户端_读《HBase权威指南》 客户端API:基础知识