linux怎么查看本机内存大小
248
2023-01-12
Java多线程实现模拟12306火车站售票系统
该系统一共涉及到3个类:
车票(Ticket)
12306系统(System12306)
售票窗口(Window)
车票类,涉及三个属性:
起始站
终点站
票价
public class Ticket {
//起始站
private String startStation;
//终点站
private String destination;
/**POJO对象,它里面的基本类型最好使用包装类
* 因为如果如果该类用来装从数据库中读取的信息
* 如果读取出null,那么基本类型是无法存null的,就会报错*/
//票价
private Float price;
public Ticket(){}
public Ticket(String startStation, String destination, Float price) {
this.startStation = startStation;
this.destination = destination;
this.price = price;
}
//为了让打印输出时方便,我们重写toString方法
public String toString() {
StringBuilder builder = new StringBuilder("[");
builder.append(this.startStation);
builder.append("--->");
builder.append(this.destination);
builder.append(":");
builder.append(this.price);
builder.append("]");
return builder.toString();
}
//get() and set()....
}
12306系统,有一个属性—>Vector集合,有一个方法—>获取一张车票getTicket()
利用Vector集合存储该系统所有的车票
利用Vector的线程安全特性,同一时bxsVQBPjXh间只能有一个线程操作该集合,保证安全
并且该系统应该是单例的
public class System12306 {
//设计一个单例模式
private System12306(){}
private static volatile System12306 sys;
public static System12306 getInstance(){
if (sys == null){
synchronized (System12306.class){
if(sys == null)
sys = new System12306();
}
}
return sys;
}
//属性,用一个集合存票,我们使用线程安全的Vector,或者使用Stack,它继承了Vector
private Vector
private String[] starts = {"北京","天津","太原","运城","西安"};
private String[] ends = {"上海","武汉","苏州","深圳","昆明","广州"};
//当前系统创建后,就给tickets集合赋值
{
for(int i = 10;i<100;i++){//一共90张票
int r1 = (int)(Math.random()*starts.length);
int r2 = (int)(Math.random()*ends.length);
float price = r1*r2*5+140;
tickets.add(new Ticket(starts[r1],ends[r2],price));
}
}
//设计一个方法,从集合中获取一张票
public Ticket getTicket(){
try {
return tickets.remove(0);
}catch (Exception e){
return null;
}
}
}
售票窗口类,有一个属性—>窗口名称,有一个方法—>出售车票sellTicket()
同一时间有多个窗口同时售票,该类实现了Runnable接口,达到多线程并发的效果
public class Window implements Runnable {
private String windowName;//窗口的名字
public Window(String windowName){
this.windowName = windowName;
}
@Override
public void run() {
this.sellTicket();
}
public void sellTicket(){
while (true){
System12306 sys = System12306.getInstance();
Ticket ticket = sys.getTicket();
if(ticket==null){
System.out.println("对不起,"+windowName+"窗口车票已售完...");
break;
}
System.out.println("从"+windowName+"窗口售出:"+ticket);
}
}
}
测试代码:
public class TestMain {
public static void main(String[] args) {
Window win1 = new Window("北京西站");
Window win2 = new Window("运城北站");
Window win3 = new Window("太原南站");
new Thread(win1).start();
new Thread(win2).start();
new Thread(win3).start();
}
}
多线程并发执行的效果:
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~