Java:多线程模拟多站点售票过程
package com.zj.tickets;
public enum Destation {
BEIJING, SHANGHAI, TIANJING
}
|
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;
}
}
|
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.BEIJING, new Ticket(5, Destation.BEIJING));
tickets.put(Destation.SHANGHAI, new Ticket(5, Destation.SHANGHAI));
tickets.put(Destation.TIANJING, new 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);
}
}
|
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();
}
}
|
Java:多线程模拟多站点售票过程相关推荐
- java多线程模拟实现12306售票
业务描述 假设有200张票,用4个线程去订票,不能有两个或者以上的线程订到了 同一个票(原因就不说了),当最后一张票卖掉的时候结束,再订就抛 异常提示出票卖完了. 业务分析 1.需要创建一个车票类,初 ...
- Java多线程模拟售票系统
Java创建多线程的两种基本方法: 方法1.继承Thread类 (1)定义子类,继承Thread类,重写该类的run()方法作为线程执行体; (2)创建该子类的实例作为线程对象; (3)调用线程对象的 ...
- java多线程模拟购买火车票
java多线程模拟购买火车票 本次做的是一个火车票的售卖模拟,不管用户是在窗口还是APP上购买,必然不可能买到同一张票这也就是说一张票的售卖必然是一个线程在操作的,所以,我们在写代码是也要注意这一点 ...
- java多线程模拟龟兔赛跑,JAVA多线程模拟龟兔赛跑
JAVA多线程模拟龟兔赛跑! class Rabbit extends Thread{ Tortoise tor; int Journey; int RabbitSpeed; public Rabbi ...
- Java多线程 模拟 购买 退订 机票
Java多线程 模拟 购买 退订 机票 package cn.com.cloud.sea.thread; /*** @author HenryLee* @version 1.0* 买票*/ publ ...
- 利用JAVA多线程模拟售票系统,对统一资源进行处理
首先多线程处理统一资源的方式有两种 分别介绍一下两者的区别 synchronized与Lock的区别 1.Lock不是Java语言内置的,synchronized是Java语言的关键字 2.synch ...
- Java多线程 模拟售票窗口售票
编写一个Java 多线程程序,完成三个售票窗口同时出售20张票 程序分析: 1.票数要使用同一个静态值: 2.为保证不会出现卖出同一个票数,要java多线程同步锁. 设计思路: 创建一个站台类Stat ...
- Java多线程模拟加工厂加工玩具
创建工厂类, 属性包括:车间类的对象的集合,仓库容量 方法包括: 1. 加工玩具的方法(product),方法的功能是各个车间同时工作.根据仓库容量平均分配给各个车间需要加工玩具的数量.2. 建造玩具 ...
- Java 多线程 模拟银行ATM实时存取钱
近期想回顾一些知识: 一.Java 多线程 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务.多线程是多任务的一种特别的形式,但多线程使用了更小的资源开 ...
最新文章
- python tk 获取鼠标事件_在Tkin中列出鼠标悬停事件函数
- 7、leetcode410 分割数组的最大值
- 实验0-Hive配置与启动
- esd管 低cj要求_TVS管与ESD保护二极管的区别,联系以及应用
- Angular内提供了一个可以快速建立测试用web服务的方法:内存 (in-memory) 服务器...
- java安全编码指南之:输入注入injection
- How do I get the lowest value of all the non zero value pixels?
- cad在线转低版本_为什么别人制图那么快?41个CAD实用技巧,3天轻松玩转CAD
- 小心了!这18位数字一泄漏,支付宝账户就可能会被他人盗刷!
- Codeforces Round #243 (Div. 1)
- Mac下使用gitHub
- SqlServer修改密码后登陆不上
- Java学生管理系统-增删改查
- Node.js 解压版 安装配置
- 3D游戏模型是怎么制作出来的?
- (轉貼) 寶蘭開發工具部門將分割成完全獨立的子公司 (C/C++) (News)
- MiniMap(小地图)插件
- 软件架构模式 mark Richards - 读后总结 1 - 分层架构
- win7怎么装python_如何在win7上面安装python的包
- slf4j简单介绍(2)-使用
热门文章
- BZOJ 4602: [Sdoi2016]齿轮 dfs
- 社会对IT 从业人员综合素质的需求
- linux 快组描述符,Linux 进程描述符 task struct
- matlab cgf sc 未定义,matlab通用神經網絡代碼
- php抓取网页css,php 抓取的页面如何处理可以只保留DOM结构,去掉CSS和JS?
- php 多字节截取,将多字节字符串截断为n个字符
- 7个使用JavaScript构建数据可视化的实用工具库,希望你能喜欢
- 零基础开始学前端有什么建议?
- 高响应比优先调度算法 (HRRN)例题
- hbase 客户端_读《HBase权威指南》 客户端API:基础知识