代码语言
.
CSharp
.
JS
Java
Asp.Net
C
MSSQL
PHP
Css
PLSQL
Python
Shell
EBS
ASP
Perl
ObjC
VB.Net
VBS
MYSQL
GO
Delphi
AS
DB2
Domino
Rails
ActionScript
Scala
代码分类
文件
系统
字符串
数据库
网络相关
图形/GUI
多媒体
算法
游戏
Jquery
Extjs
Android
HTML5
菜单
网页交互
WinForm
控件
企业应用
安全与加密
脚本/批处理
开放平台
其它
【
Java
】
模拟售票,多线程的同步与互斥
作者:
wccfgt
/ 发布于
2012/11/19
/
633
模拟售票,一个窗口售票,多个买票者购票,票数设为50 主要是利用线程间的同步于互斥 同步
/** * 模拟售票,一个窗口售票,多个买票者购票,票数设为50 主要是利用线程间的同步于互斥 * * 同步:线程2必须在线程1完成后才能进行 * 互斥:线程2和线程3访问同一变量,一次只能有一个线程访问 * * @author * */ public class SaleTicket { public static void main(String[] args) { Ticket t = new Ticket(50); setTicket set = new setTicket(t);// 售票线程 set.start(); // 买票线程 for (int i = 1; i <= 52; i++) { getTicket get = new getTicket(t, "买票者 " + i + " "); get.start(); } } } //票对象 class Ticket { private int ticketNum;// 票数 boolean write = false;// 售票与买票间的同步信号量,同一时间只有一张票卖出 boolean read = true;// 买票者 买票间的信号量,一张票只能卖给一个人 public Ticket(int ticketNum) { this.ticketNum = ticketNum; } // 取票,票数减一 public synchronized void getTicket(String name) throws InterruptedException { // 售票员正忙,买票者进行等待 while (!write && read) { System.out.println("*****************************" + name + " 买票等待。。。"); this.wait(); } write = false;// 某个买票者要买票,售票员办理即进行等待 if (ticketNum > 0) { read = false;// 让其他买票者等待 System.out.println("*****************************" + name + " 买票成功,号码=" + ticketNum); this.subTicketNum();// 销售一张票 read = true;// 让其他买票者进行买票 this.notifyAll(); } else {// 票数为0 read = false; System.out.println("*****************************票已经售完, " + name + " 没有买到票"); } } // 售票 public synchronized void sellTicket(String name) throws InterruptedException { // 只要票数大于0,售票员就一直进行售票 while (ticketNum > 0) { while (write) { // 进行售票 System.out.println(name + " 处理业务,售票等待。。。"); this.wait(); } if (ticketNum > 0) { System.out.println(name + " 开始售票,号码=" + ticketNum); } write = true; this.notifyAll(); } System.out.println(name + " 对不起,售票已经售完!"); } public void subTicketNum() { if (this.ticketNum > 0) this.ticketNum = this.ticketNum - 1; } public int getTicketNum() { return ticketNum; } } // 购票者 class getTicket extends Thread { Ticket d;// 包含剩余票数 String name;// 购票者姓名 public getTicket(Ticket d, String name) { this.d = d; this.name = name; } public void run() { try { d.getTicket(name); } catch (InterruptedException e) { e.printStackTrace(); } } } // 售票员 class setTicket extends Thread { Ticket d; public setTicket(Ticket d) { this.d = d; } public void run() { try { d.sellTicket("售票员 1 "); } catch (InterruptedException e) { e.printStackTrace(); } } }
试试其它关键字
多线程
同语言下
.
List 切割成几份 工具类
.
一行一行读取txt的内容
.
Java PDF转换成图片并输出给前台展示
.
java 多线程框架
.
double类型如果小数点后为零则显示整数否则保留两位小
.
将图片转换为Base64字符串公共类抽取
.
sqlParser 处理SQL(增删改查) 替换schema 用于多租户
.
JAVA 月份中的第几周处理 1-7属于第一周 依次类推 29-
.
java计算两个经纬度之间的距离
.
输入时间参数计算年龄
可能有用的
.
C#实现的html内容截取
.
List 切割成几份 工具类
.
SQL查询 多列合并成一行用逗号隔开
.
一行一行读取txt的内容
.
C#动态修改文件夹名称(FSO实现,不移动文件)
.
c# 移动文件或文件夹
.
c#图片添加水印
.
Java PDF转换成图片并输出给前台展示
.
网站后台修改图片尺寸代码
.
处理大图片在缩略图时的展示
wccfgt
贡献的其它代码
(
1
)
.
模拟售票,多线程的同步与互斥
Copyright © 2004 - 2024 dezai.cn. All Rights Reserved
站长博客
粤ICP备13059550号-3