简单模型:
门票生产者:Production
门票购买者:Operation
售票中心:TicketOffice
门票:Ticket
功能说明:
售票中心的门票最大库存10000张,最小库存100张,当大于最大库存时售票中心将不再购买门票,当小于最小库存售票中心则通知门票生产者生产门票并主动运输给售票中心。
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
/**
*
* 售票中心
*
* @author ZAKAI
*
*/
public class TicketOffice {
private BlockingQueue<Ticket> queue = new LinkedBlockingQueue<Ticket>();
/**
* 售票最大存货
*/
private static final int MAX = 10000;
private static final int MIN = 100;
/**
* 存入入场票
*
* @param t
* 门票实体
* @throws InterruptedException
* 异常实体
*/
public void storeTicket(final Ticket t) throws InterruptedException {
synchronized (this) {
if (!queue.isEmpty()) {
while (TicketOffice.MAX < queue.size()) {
System.out.println("售票中心:存票太多了,暂停进货...目前存票有:"
+ queue.size() + "张!");
notify();
wait();
}
System.out.println("售票中心:进货中..目前存票有:" + queue.size() + "张!");
}
}
queue.put(t);
}
/**
* 卖出入场票
*
* @return 门票
* @throws InterruptedException
* 异常实体
*/
public Ticket sellOut() throws InterruptedException {
synchronized (this) {
while (queue.isEmpty()) {
System.out.println("售票中心:票卖完了,等待进货...");
notify();
wait();
}
// 当库存小于最小库存数量开始开始通知生产者生产
if (TicketOffice.MIN > queue.size()) {
System.out.println("售票中心:票的数量低于最小库存了,通知门票生产者送货上门...");
notify();
}
}
return queue.take();
}
}
/**
*
* 门票生产者
*
* @author ZAKAI
*
*/
public class Production implements Runnable {
private static int id = 1;
private TicketOffice ticketOffice = null;
public Production(TicketOffice ticketOffice) {
this.ticketOffice = ticketOffice;
}
public void run() {
for (;;) {
try {
ticketOffice.storeTicket(making());
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
}
private Ticket making() {
Ticket t = new Ticket(++id);
System.out.println("门票制造商:已经制造票一张");
return t;
}
}
/**
*
* 门票购买者
*
* @author ZAKAI
*
*/
public class Operation implements Runnable {
/**
* 售票中心
*/
private TicketOffice ticketOffice = null;
public Operation(TicketOffice ticketOffice) {
this.ticketOffice = ticketOffice;
}
public void run() {
for (;;) {
try {
buy();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/**
*
*
* 到售票中心购买门票
*
* @throws InterruptedException
*/
public void buy() throws InterruptedException {
System.out.println(" 门票购买者:买票中...");
Ticket t = ticketOffice.sellOut();
System.out.println("门票购买者:" + t + " 票被买到了...");
}
}
/**
*
* 门票实体
*
* @author ZAKAI
*
*/
public class Ticket {
/**
* 门票标识号
*/
private int id;
public Ticket(int id) {
this.id = id;
}
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("ticket id ").append(id);
return sb.toString();
}
}
public class Main {
public static void main(String args[]) {
final TicketOffice ticketOffice = new TicketOffice();
Thread productionTrd = new Thread(new Production(ticketOffice));
Thread operationTrd = new Thread(new Operation(ticketOffice));
productionTrd.start();
operationTrd.start();
}
}
分享到:
相关推荐
上课写的一个多线程买票系统,还不是很完美,希望大神指点。
linux下多线程是想操作系统的经典生产者和消费者模拟实验。用C语言编写,gcc能够编译。而且含有makefile文件的解释。
模拟三个人排队买票,张某、李某、赵某买电影票、售票员只有3张5元的钱, 电影票5元钱一张。张某拿20元一张的新人民币排在李的钱买票, 李某排在赵的前面拿一张10元的人民币买票,赵某拿一张5元的人民币买票 ...
多线程买票是java中的一个经典案例,其主要思想无非包括2点,synchronized和锁,两者中,前者实现同步,后者为同步的线程提供锁,从而实现多个线程共享同一份资源时候,能够同步进行; 经典的方式是synchronized + 锁...
多线程:4窗口同时买票
Java 多线程 订票 示例 线程安全 Demo 例子 经典
模拟多人不同面值购票找零的多线程代码(java版)模拟多人不同面值购票找零的多线程代码(java版)
操作系统--多线程买票---python--有窗体界面,就是操作系统课上的一个课外练习,传上去,保存下来。 exe文件在 map文件夹-->dict文件夹-->map文件夹-->map.exe 已经打包好了,没有python环境的电脑上也...
swift NSThread线程同步买票小例子
模拟电影院的多线程购票系统,使用同步锁机制保证数据的安全,同时使用集合的减法来进行,顾客买票时选购位置
简单学习多线程有力的好帮手,我也是刚刚学习总结的自己的经验 希望大家借鉴,
车票无忧,快速买票软件,可以准时抢火车票。
一场激烈足球赛即将开始,售票员紧张地卖票着……。 每张球票50元,现在有2n(1)个球迷排队购票,其中n个手持50元钞票,另外n个手持100元钞票。假设开始售票时售票处没有零钱可以找零。 问这2n个人有多少种排队方式...
本篇文章给大家分享了Java多线程模拟售票程序和线程安全问题的相关知识点,对此有兴趣的朋友可以参考学习下。
好用的电影买票系统,可以实现清场,并有记忆功能。实现团体购票和个人沟桥。vc++图形界面
linux多线程使用实例:在linux系统环境下的买票退票系统
车票管理系统,实现车票的输入、查询、购票、买票等功能
火车站买票问题代码
JAVA JCreator Pro 买票系统 需运用到 线程 结果可以看到 票在哪对应窗口买到的
设计一个程序模拟插队买票的过程,本实验假设售票大厅有2个售票窗口,无论到哪个窗口买票都必须排队,但是新来的人不一定排在队尾,允许插队(即直接排在朋友的后面)。假设已经在排队的人不会离开,也不会移到其他...