Java使用多线程模拟售票
实现代码:
package com.fan.base;
import lombok.Getter;
import lombok.Setter;
import java.util.Stack;
/**
* 多线程同步方法测试
*/
public class MultipleThreadSellTicketSynchronizingDemo {
public static void main(String[] args) {
SellTicket sellTicket=new SellTicket();
sellTicket.add(); //添加门票
//创建线程 并且启动
new Thread(sellTicket,"一号售票窗口").start();
new Thread(sellTicket,"二号售票窗口").start();
new Thread(sellTicket,"三号售票窗口").start();
}
}
/**
* 门票类
*/
@Setter
@Getter
class Ticket{
private int count;
//初始化票数
public Ticket(int count) {
this.count=count;
}
Stack<Integer>list=new Stack<>();
//添加门票
public void addTickets(){
for (int i=1;i<=count;i++) {
list.push(i); //将票存入栈中
}
}
//售出门票
public void sellTickets(){
Integer pop = list.pop(); //移除栈顶元素并返回值
System.out.println(Thread.currentThread().getName()+":售出第"+pop+"张票 ");
count=list.size(); //更新剩余票数
if (count==0){
System.out.println("票已售空!");
}
}
}
/**
* 售票类 (实现Runnable接口 实现多线程)
*/
class SellTicket implements Runnable{
Ticket ticket=new Ticket(100); //初始化票数
//添加票数
public void add(){
ticket.addTickets();
}
public void run(){
//调用买票方法(判断栈是否为空 空推吹循环)
while (!ticket.list.empty()){
if (ticket.getCount()>0){
sellTicket();
}else{
break;
}
}
}
//定义售票方法
private synchronized void sellTicket(){
//栈不为空 执行
if (!ticket.list.empty()) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
//调用售票方法
ticket.sellTickets();
}
}
}