2. 某某市动物园因疫情防控原因, 每日只能接待1000名游客(即每天只有1000张票), 有3个售票窗口进行售票.窗口卖出去一张票之后, 要打印"窗口X卖出一张票, 当前剩余xxx张票", 其中"窗口X"是每个窗口的名称(即:线程名).3个窗口的名字分别是 窗口A, 窗口B, 窗口C(1) 在com.lanou.main包里创建一个SellTicketTest类, 在类的main方法中完成售票功能(2) 通过Thread子类的方式实现一遍售票功能, Thread子类创建在com.lanou.task包里.创建Thread子类TicketThread,TicketThread类中的run方法里实现单个窗口的卖票(3) 通过Runnable实现类的方式实现一遍, Runnable子类创建在com.lanou.runnable包里创建Runnable接口的实现类TicketTask
时间: 2023-06-11 10:07:57 浏览: 39
(1) 代码实现:
```java
package com.lanou.main;
import java.util.concurrent.atomic.AtomicInteger;
public class SellTicketTest {
public static void main(String[] args) {
AtomicInteger total = new AtomicInteger(1000); // 剩余票数
SellTicketWindow windowA = new SellTicketWindow("窗口A", total);
SellTicketWindow windowB = new SellTicketWindow("窗口B", total);
SellTicketWindow windowC = new SellTicketWindow("窗口C", total);
windowA.start();
windowB.start();
windowC.start();
}
}
class SellTicketWindow extends Thread {
private AtomicInteger total; // 剩余票数
private String windowName; // 窗口名称
public SellTicketWindow(String windowName, AtomicInteger total) {
this.windowName = windowName;
this.total = total;
}
@Override
public void run() {
while (total.get() > 0) {
synchronized (total) { // 锁定剩余票数
if (total.get() > 0) {
int remain = total.decrementAndGet(); // 减少剩余票数并获取当前值
System.out.println(windowName + "卖出一张票,当前剩余" + remain + "张票");
}
}
}
}
}
```
(2) 代码实现:
```java
package com.lanou.task;
import java.util.concurrent.atomic.AtomicInteger;
public class TicketThread extends Thread {
private AtomicInteger total; // 剩余票数
private String windowName; // 窗口名称
public TicketThread(String windowName, AtomicInteger total) {
this.windowName = windowName;
this.total = total;
}
@Override
public void run() {
while (total.get() > 0) {
synchronized (total) { // 锁定剩余票数
if (total.get() > 0) {
int remain = total.decrementAndGet(); // 减少剩余票数并获取当前值
System.out.println(windowName + "卖出一张票,当前剩余" + remain + "张票");
}
}
}
}
}
```
(3) 代码实现:
```java
package com.lanou.runnable;
import java.util.concurrent.atomic.AtomicInteger;
public class TicketTask implements Runnable {
private AtomicInteger total; // 剩余票数
private String windowName; // 窗口名称
public TicketTask(String windowName, AtomicInteger total) {
this.windowName = windowName;
this.total = total;
}
@Override
public void run() {
while (total.get() > 0) {
synchronized (total) { // 锁定剩余票数
if (total.get() > 0) {
int remain = total.decrementAndGet(); // 减少剩余票数并获取当前值
System.out.println(windowName + "卖出一张票,当前剩余" + remain + "张票");
}
}
}
}
}
```