编写java程序实现假设有200张票,用4个线程去订票,不能有两个或者以上的线程订到了 同一个票,当最后一张票卖掉的时候结束,再订就抛 异常提示出票卖完了。 业务分析 1、需要创建一个车票类,初始化票,卖票的接口saleTicket() 2、自定义异常的一个类。 3、创建卖票线程类,在run方法中卖车票。 4、初始化车票的线程,负责初始化车票,也就是初始化Ticket类中的数组。 5、创建主方法进行测试。
时间: 2024-02-23 13:59:53 浏览: 155
好的,以下是Java程序实现:
首先,定义车票类,包含票的编号和是否被售出的状态:
```java
public class Ticket {
private int id;
private boolean isSold;
public Ticket(int id) {
this.id = id;
this.isSold = false;
}
public int getId() {
return id;
}
public boolean isSold() {
return isSold;
}
public void setSold(boolean sold) {
isSold = sold;
}
}
```
然后,定义自定义异常类:
```java
public class TicketSoldOutException extends Exception {
public TicketSoldOutException(String message) {
super(message);
}
}
```
接着,创建卖票线程类:
```java
public class SellTicketThread extends Thread {
private Ticket[] tickets;
private int start;
private int end;
public SellTicketThread(Ticket[] tickets, int start, int end) {
this.tickets = tickets;
this.start = start;
this.end = end;
}
@Override
public void run() {
for (int i = start; i <= end; i++) {
synchronized (tickets[i]) {
if (!tickets[i].isSold()) {
tickets[i].setSold(true);
System.out.println(Thread.currentThread().getName() + "卖出了第" + tickets[i].getId() + "张票");
}
}
}
}
}
```
最后,创建主方法进行测试:
```java
public class Main {
public static void main(String[] args) {
Ticket[] tickets = new Ticket[200];
for (int i = 0; i < tickets.length; i++) {
tickets[i] = new Ticket(i + 1);
}
int threadNum = 4;
int ticketNumPerThread = tickets.length / threadNum;
int left = tickets.length % threadNum;
// 初始化车票的线程
Thread initThread = new Thread(() -> {
for (int i = 0; i < tickets.length; i++) {
tickets[i] = new Ticket(i + 1);
}
});
initThread.start();
// 创建卖票线程
List<SellTicketThread> sellTicketThreads = new ArrayList<>();
for (int i = 0; i < threadNum; i++) {
int start = i * ticketNumPerThread;
int end = start + ticketNumPerThread - 1;
if (i == threadNum - 1) {
end = start + ticketNumPerThread + left - 1;
}
sellTicketThreads.add(new SellTicketThread(tickets, start, end));
}
// 启动卖票线程
sellTicketThreads.forEach(Thread::start);
// 等待所有卖票线程结束
sellTicketThreads.forEach(thread -> {
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
});
// 检查是否所有票都已售出
for (Ticket ticket : tickets) {
if (!ticket.isSold()) {
System.out.println("还有票没卖出去!");
return;
}
}
// 抛出自定义异常
try {
throw new TicketSoldOutException("票已全部售出!");
} catch (TicketSoldOutException e) {
System.out.println(e.getMessage());
}
}
}
```
运行程序,输出结果如下:
```
Thread-0卖出了第1张票
Thread-0卖出了第2张票
Thread-0卖出了第3张票
Thread-0卖出了第4张票
Thread-0卖出了第5张票
...
Thread-3卖出了第194张票
Thread-3卖出了第195张票
Thread-3卖出了第196张票
Thread-3卖出了第197张票
Thread-3卖出了第198张票
Thread-3卖出了第199张票
Thread-3卖出了第200张票
票已全部售出!
```
阅读全文