package MultiThreadTest;
/**
* @author 苏雪夜酒
* @version 1.0
* @date 2021/10/24 17:28
* 多线程之售票问题
* 售票窗口类
*/
public class SellTicketsWindows{
//变量 ticketAmount
private int ticketAmount;
//构造方法
public SellTicketsWindows(int ticketAmount) {
this.ticketAmount = ticketAmount;
}
//获取剩余票数
public int getTicketAmount() {
return ticketAmount;
}
public synchronized int sellTickets(int amount){
if (this.ticketAmount >= amount){
this.ticketAmount -= amount;
return amount;
}else {
return 0;
}
}
}
package MultiThreadTest;
import java.util.ArrayList;
import java.util.Random;
import java.util.Vector;
/**
* @author 苏雪夜酒
* @version 1.0
* @date 2021/10/24 17:11
* 多线程之售票问题
* 主入口类
*/
public class SellTicketsThread {
public static void main(String[] args) throws InterruptedException {
//初始化售票窗口,并设定售票总数为10000
SellTicketsWindows ticketsWindows = new SellTicketsWindows(10000);
//声明线程集合 模拟多人买票
ArrayList<Thread> threads = new ArrayList<>();
//售出票数总和 Vector 因为考虑到多线程的场景 故 选用了线程安全的 Vector 集合
Vector<Integer> integers = new Vector<>();
for (int i = 0; i < 1000; i++) {
Thread thread = new Thread(()->{
integers.add(ticketsWindows.sellTickets(randomAmount()));
});
threads.add(thread);
thread.start();
}
for (Thread thread: threads) {
thread.join(100);
}
//统计相关票数
System.out.println("剩余票数:" + ticketsWindows.getTicketAmount());
System.out.println("售出票数:" + integers.stream().mapToInt(i->i).sum());
}
static Random random = new Random();
//模拟用户随机买票数 1~5
public static int randomAmount(){
return random.nextInt(5) + 1;
}
}