设计一个火车售票模拟程序ticket.java。假如火车站有100张火车票要卖出,现在有5个售票点同时售票,用5个线程模拟这5个售票点的售票情况。要求如下:\n\n(1)打印出每个售票点所卖出的票号;
时间: 2023-05-31 14:19:34 浏览: 471
多线程设计一个火车售票模拟程序
### 回答1:
这是一道关于设计火车售票模拟程序的题目,要求以ticket.java文件的形式呈现。假设第一站有100张火车票要售出,现在在第5个售票点同时出售火车票,共有5个线程模拟售票情况。要求如下:(1)打印出每个售票点所售出的票号。
### 回答2:
题目描述:
设计一个火车售票模拟程序ticket.java。假如火车站有100张火车票要卖出,现在有5个售票点同时售票,用5个线程模拟这5个售票点的售票情况。要求如下:
(1)打印出每个售票点所卖出的票号;
(2)程序要考虑多线程操作时的安全性。
解题思路:
本题需要设计一个火车售票模拟程序,该程序要考虑到多线程并发的安全性问题。具体实现思路如下:
(1)创建一个Ticket类,该类包含售票点编号(1-5)、已售票数、总票数等属性,以及售票方法sell(),售票过程中需要判断剩余票数是否足够,并返回售票结果。
(2)在main函数中创建5个线程分别模拟5个售票点售票的过程,每个线程需要以售票点编号为参数创建一个Ticket对象,并在线程开始时调用该对象的sell()方法售票。
(3)在sell()方法中,需要使用同步锁保证操作的原子性和线程安全。
(4)在售票过程中,需要打印出所卖出的票号。
完整代码如下:
public class Ticket {
private int sellPoint; // 售票点编号
private int total; // 总票数
private int sold; // 已售票数
public Ticket(int sellPoint, int total) {
this.sellPoint = sellPoint;
this.total = total;
}
public synchronized void sell() {
if (total > 0) {
System.out.println("售票点" + sellPoint + "卖出第" + (100 - total + 1) + "张票。");
total--;
} else {
System.out.println("售票点" + sellPoint + "已售完。");
}
}
public static void main(String[] args) {
Ticket t1 = new Ticket(1, 100);
Ticket t2 = new Ticket(2, 100);
Ticket t3 = new Ticket(3, 100);
Ticket t4 = new Ticket(4, 100);
Ticket t5 = new Ticket(5, 100);
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
t1.sell();
if (t1.total <= 0) {
break;
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
t2.sell();
if (t2.total <= 0) {
break;
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
t3.sell();
if (t3.total <= 0) {
break;
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
t4.sell();
if (t4.total <= 0) {
break;
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
t5.sell();
if (t5.total <= 0) {
break;
}
}
}
}).start();
}
}
在主函数中,创建了5个线程,分别模拟了5个售票点的售票过程,每个线程的售票过程都是在一个无限循环中进行的,直到票已经售完才退出循环。
在线程中,调用了Ticket类的sell()方法,该方法通过synchronized关键字实现了同步锁,确保了售票过程的原子性和线程安全。
在sell()方法中,需要打印出所售出的票号,可以通过total变量计算出来。
因此,在运行程序时,除了满足每个售票点出售的总票数为100以外,还满足了要求打印出每个售票点所卖出的票号的要求。
### 回答3:
首先,我们需要定义一个 Ticket 类来表示火车票,包括票号(ticketNumber)属性。然后,我们可以用一个票池(ticketPool)来存储所有的火车票。
public class Ticket {
private int ticketNumber;
public Ticket(int ticketNumber) {
this.ticketNumber = ticketNumber;
}
public int getTicketNumber() {
return ticketNumber;
}
}
List<Ticket> ticketPool = new ArrayList<>();
for(int i = 1; i <= 100; i++){
ticketPool.add(new Ticket(i));
}
然后,我们需要定义一个 TicketSeller 类来表示售票员,用一个线程来模拟售票的过程,每个售票员需要从票池中取出一个火车票进行售卖,售卖后会将票号打印出来。
public class TicketSeller implements Runnable{
private List<Ticket> ticketPool;
private String sellerName;
public TicketSeller(List<Ticket> ticketPool, String sellerName) {
this.ticketPool = ticketPool;
this.sellerName = sellerName;
}
@Override
public void run() {
while(true) {
synchronized (ticketPool) {
if(ticketPool.isEmpty()){
System.out.println("票已经售完了");
break;
}else {
Ticket ticket = ticketPool.remove(0);
System.out.println(sellerName + "售出了第" + ticket.getTicketNumber() + "号票");
}
}
}
}
}
现在我们可以创建 5 个售票员(ticketSeller1、ticketSeller2、ticketSeller3、ticketSeller4、ticketSeller5),每个售票员使用一个线程来模拟售票,每个线程都使用 ticketPool 当作售卖的票池:
TicketSeller ticketSeller1 = new TicketSeller(ticketPool, "售票员1");
TicketSeller ticketSeller2 = new TicketSeller(ticketPool, "售票员2");
TicketSeller ticketSeller3 = new TicketSeller(ticketPool, "售票员3");
TicketSeller ticketSeller4 = new TicketSeller(ticketPool, "售票员4");
TicketSeller ticketSeller5 = new TicketSeller(ticketPool, "售票员5");
Thread thread1 = new Thread(ticketSeller1);
Thread thread2 = new Thread(ticketSeller2);
Thread thread3 = new Thread(ticketSeller3);
Thread thread4 = new Thread(ticketSeller4);
Thread thread5 = new Thread(ticketSeller5);
然后,我们可以启动这五个线程,开始模拟售票的过程:
thread1.start();
thread2.start();
thread3.start();
thread4.start();
thread5.start();
当售票员从票池中取出一张火车票后,票池可能出现竞争情况,所以我们需要对票池进行同步处理,使用 synchronized 块来保证同一时间只有一个线程能够访问 ticketPool 对象。
最终,我们可以看到每个售票员售出的票号,售票员可能会在不同的时间售出不同的票,因为取票的顺序是随机的。
总的来说,这个模拟程序可以让我们更好地理解多线程并发编程的思想,也可以帮助我们更好地掌握 synchronized 的使用方法。
阅读全文