通过多线程的同步于互斥,模拟售票
2012-11-17 14:26
246 查看
/**
* 模拟售票,一个窗口售票,多个买票者购票,票数设为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();
}
}
}
* 模拟售票,一个窗口售票,多个买票者购票,票数设为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();
}
}
}
相关文章推荐
- 同步与互斥经典案例——模拟火车票售票系统
- 编写多线程程序,模拟多个人通过一个山洞。
- 在iOS中有几种方法来解决多线程访问同一个内存地址的互斥同步问题
- (面试)多线程模拟火车站窗口售票程序。
- Windows多线程的同步与互斥
- 多线程并发库高级应用 之 传统定时器、互斥、同步通信技术
- 讲Linux下面线程的操作、多线程的同步和互斥相关函数及操作的文章链接
- iOS (objective-c) 中的多线程互斥同步问题
- 张孝祥[致敬]-多线程学习第03课-线程的互斥与同步
- 第二十六篇:JAVA多线程机制之同步与互斥
- 多线程中的互斥与同步
- 多线程的同步与互斥
- Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥)
- iOS-多线程(模拟火车票售票系统)
- JAVA多线程互斥同步例子
- java多线程之火车售票系统模拟
- iOS 多线程 锁 互斥 同步
- java中多线程模拟(多生产,多消费,Lock实现同步锁,替代synchronized同步代码块)
- 【Linux多线程】同步与互斥的区别
- linux多进程多线程互斥同步例子