设计java一个程序,能够让多个用户同时从4个销售点完成100张票的购票操作
时间: 2023-12-14 09:38:10 浏览: 36
这个问题涉及到并发编程,可以通过使用多线程来现多个用户同时购票。
首先,需要定义一个Ticket类,用于表示票的信息,包括票号和销售点编号等。
```java
public class Ticket {
private int id;
private int salesPoint;
public Ticket(int id, int salesPoint) {
this.id = id;
this.salesPoint = salesPoint;
}
public int getId() {
return id;
}
public int getSalesPoint() {
return salesPoint;
}
@Override
public String toString() {
return "Ticket{" +
"id=" + id +
", salesPoint=" + salesPoint +
'}';
}
}
```
然后,我们定义一个TicketBox类,用于表示所有的票,并提供购票和获取票的方法。
```java
import java.util.ArrayList;
import java.util.List;
public class TicketBox {
private List<Ticket> tickets;
public TicketBox(int count) {
tickets = new ArrayList<>();
for (int i = 1; i <= count; i++) {
tickets.add(new Ticket(i, 0));
}
}
public synchronized Ticket buyTicket(int salesPoint) {
for (Ticket ticket : tickets) {
if (ticket.getSalesPoint() == 0) {
ticket = new Ticket(ticket.getId(), salesPoint);
return ticket;
}
}
return null;
}
public synchronized List<Ticket> getTickets() {
return tickets;
}
}
```
在购票的方法中,我们需要使用synchronized关键字来保证多个用户不会同时购买同一张票。
接下来,我们定义一个SalesPoint类,用于表示一个销售点,提供购票和获取已售票的方法。
```java
import java.util.List;
public class SalesPoint {
private int id;
private TicketBox ticketBox;
public SalesPoint(int id, int ticketCount) {
this.id = id;
ticketBox = new TicketBox(ticketCount);
}
public Ticket buyTicket() {
return ticketBox.buyTicket(id);
}
public List<Ticket> getSoldTickets() {
List<Ticket> tickets = ticketBox.getTickets();
tickets.removeIf(ticket -> ticket.getSalesPoint() != id);
return tickets;
}
}
```
最后,我们定义一个Main类,模拟多个用户同时购票的过程。
```java
public class Main {
public static void main(String[] args) {
int salesPointCount = 4;
int ticketCount = 100;
SalesPoint[] salesPoints = new SalesPoint[salesPointCount];
for (int i = 0; i < salesPointCount; i++) {
salesPoints[i] = new SalesPoint(i + 1, ticketCount / salesPointCount);
}
Thread[] threads = new Thread[ticketCount];
for (int i = 0; i < ticketCount; i++) {
int salesPointIndex = i % salesPointCount;
Thread thread = new Thread(() -> {
Ticket ticket = salesPoints[salesPointIndex].buyTicket();
System.out.println("User " + Thread.currentThread().getId() + " bought ticket: " + ticket);
});
thread.start();
threads[i] = thread;
}
for (Thread thread : threads) {
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int i = 0; i < salesPointCount; i++) {
System.out.println("Sales point " + (i + 1) + " sold tickets: " + salesPoints[i].getSoldTickets());
}
}
}
```
在Main类中,我们首先创建4个销售点,每个销售点拥有25张票。然后,我们创建100个线程模拟100个用户同时购票的过程。每个线程选择一个销售点进行购票,购票成功后打印出票的信息。最后,我们输出每个销售点已售出的票的信息。
这样,我们就完成了一个能够让多个用户同时从4个销售点完成100张票的购票操作的Java程序。