Java多线程例子8个窗口同时卖5张票(12306抢票机制)

国际惯例,先上代码:

package com.itqs;
import java.util.ArrayList;
import java.util.List;
public class ThreadStation {
//定义售票线程类(也就是窗口)
public static class Station extends Thread{
//构造方法给线程名字赋值
public Station(String name) {
super(name);
}
//票数要静态定义
static int tick=5;
//静态钥匙
static Object ob ="key"; //值是任意的
//重写run方法,实现售票操作
@Override
public void run() {
List<Integer> list = new ArrayList<>();
while (tick>0) {
synchronized(ob) { //必须使用一个同步锁,进去的人会把钥匙拿在手上,出来后才能交出钥匙
if (tick>0) {
System.out.printf("%s卖出了第%d张票 \n",getName(),tick);
list.add(tick);
tick--;
}else {
System.out.printf("%s:票已售空 \n",getName());
}
}
try {
sleep((int)(Math.random()*3000)+1); //随机休息1-3000ms
}catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.printf("%s 销售情况: %s \n",getName(),list.toString());
}
}
public static void main(String[] args) {
//实例化站台对象,并为每一个站台取名字(8个线程窗口一起卖5张票)
for (int i=1; i<=8; i++) {
String sName="窗口" + String.valueOf(i);
Station Station = new Station(sName);
Station.start();
}
}
}

1,3个窗口同时卖20张票效果:

2,8个窗口同时卖5张票情况(跟国庆一样,票有点儿紧张啊。哈哈。要抢)

posted @   IT情深  阅读(268)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示