.设计一个iava程序,能够让多个用户同时从4个销售点完成100张票的购票操作。
时间: 2023-12-14 15:38:49 浏览: 105
这是一个比较典型的多线程编程问题。我们可以使用Java的多线程机制来实现。
首先,我们需要定义一个`Ticket`类,表示一张票:
```java
public class Ticket {
private int id;
private String from;
private String to;
private boolean isSold = false;
public Ticket(int id, String from, String to) {
this.id = id;
this.from = from;
this.to = to;
}
public int getId() {
return id;
}
public String getFrom() {
return from;
}
public String getTo() {
return to;
}
public synchronized boolean isSold() {
return isSold;
}
public synchronized void sell() {
isSold = true;
}
}
```
`Ticket`类包含票的ID、出发地、目的地和是否已售出等属性,同时还有`isSold`和`sell`方法用于标记票的售出状态。
然后,我们定义一个`Seller`类,表示一个销售点:
```java
public class Seller extends Thread {
private String name;
private List<Ticket> tickets;
private int soldCount = 0;
public Seller(String name, List<Ticket> tickets) {
this.name = name;
this.tickets = tickets;
}
@Override
public void run() {
while (true) {
synchronized (tickets) {
if (soldCount >= 100) {
break;
}
for (Ticket ticket : tickets) {
if (!ticket.isSold()) {
ticket.sell();
soldCount++;
System.out.println(name + " sold ticket " + ticket.getId());
if (soldCount >= 100) {
break;
}
}
}
}
}
}
}
```
`Seller`类继承自`Thread`,表示一个销售点是一个线程。`Seller`类包含销售点的名称、售出的票数和要售卖的票列表等属性,同时还有`run`方法,用于执行售票操作。
在`run`方法中,我们使用`synchronized`关键字来保证多个线程对票列表的操作是互斥的。如果已经售出了100张票,则跳出循环。否则,遍历票列表,找到未售出的票,标记为已售出,并输出售票信息。如果已经售出了100张票,则跳出循环。
最后,我们可以定义一个`Main`类来创建4个销售点线程,并启动它们:
```java
public class Main {
public static void main(String[] args) {
List<Ticket> tickets = new ArrayList<>();
for (int i = 1; i <= 100; i++) {
tickets.add(new Ticket(i, "Beijing", "Shanghai"));
}
Seller seller1 = new Seller("Seller 1", tickets);
Seller seller2 = new Seller("Seller 2", tickets);
Seller seller3 = new Seller("Seller 3", tickets);
Seller seller4 = new Seller("Seller 4", tickets);
seller1.start();
seller2.start();
seller3.start();
seller4.start();
}
}
```
在`Main`类中,我们创建了100张票,并将它们添加到票列表中。然后,创建4个`Seller`对象,分别表示4个销售点,并启动它们的线程。
这样,就可以让多个用户同时从4个销售点完成100张票的购票操作了。
阅读全文