java1)使用三种方式实现卖票系统 2)在5个窗口中,第三个窗口的优先级最高
时间: 2024-03-10 22:47:38 浏览: 20
1) 实现卖票系统的三种方式:
a) 使用 synchronized 关键字实现同步方法
```java
public class TicketSeller implements Runnable {
private int tickets = 100; // 假设一共有100张票
private Object lock = new Object(); // 创建一个锁对象
@Override
public void run() {
while (true) {
sellTicket();
}
}
private synchronized void sellTicket() { // 同步方法
if (tickets > 0) {
System.out.println(Thread.currentThread().getName() + "售出第" + tickets + "张票");
tickets--;
}
}
}
public class Test {
public static void main(String[] args) {
TicketSeller seller = new TicketSeller();
// 创建五个线程,代表五个售票窗口
for (int i = 0; i < 5; i++) {
new Thread(seller, "窗口" + (i + 1)).start();
}
}
}
```
b) 使用 Lock 接口及其实现类 ReentrantLock 实现同步
```java
public class TicketSeller implements Runnable {
private int tickets = 100; // 假设一共有100张票
private Lock lock = new ReentrantLock(); // 创建一个锁对象
@Override
public void run() {
while (true) {
sellTicket();
}
}
private void sellTicket() {
lock.lock(); // 加锁
try {
if (tickets > 0) {
System.out.println(Thread.currentThread().getName() + "售出第" + tickets + "张票");
tickets--;
}
} finally {
lock.unlock(); // 解锁
}
}
}
public class Test {
public static void main(String[] args) {
TicketSeller seller = new TicketSeller();
// 创建五个线程,代表五个售票窗口
for (int i = 0; i < 5; i++) {
new Thread(seller, "窗口" + (i + 1)).start();
}
}
}
```
c) 使用 AtomicInteger 类实现原子操作
```java
public class TicketSeller implements Runnable {
private AtomicInteger tickets = new AtomicInteger(100); // 假设一共有100张票
@Override
public void run() {
while (true) {
sellTicket();
}
}
private void sellTicket() {
int remainingTickets = tickets.getAndDecrement(); // 原子操作:获取当前票数并减1
if (remainingTickets > 0) {
System.out.println(Thread.currentThread().getName() + "售出第" + remainingTickets + "张票");
}
}
}
public class Test {
public static void main(String[] args) {
TicketSeller seller = new TicketSeller();
// 创建五个线程,代表五个售票窗口
for (int i = 0; i < 5; i++) {
new Thread(seller, "窗口" + (i + 1)).start();
}
}
}
```
2) 在五个窗口中,第三个窗口的优先级最高,可以使用 Thread 类的 setPriority() 方法设置线程的优先级。在本例中,可以将第三个窗口的线程设置为最高优先级(10),其他窗口的线程设置为默认优先级(5)。
```java
public class TicketSeller implements Runnable {
private int tickets = 100; // 假设一共有100张票
@Override
public void run() {
while (true) {
sellTicket();
}
}
private void sellTicket() {
if (tickets > 0) {
System.out.println(Thread.currentThread().getName() + "售出第" + tickets + "张票");
tickets--;
}
}
}
public class Test {
public static void main(String[] args) {
TicketSeller seller = new TicketSeller();
// 创建五个线程,代表五个售票窗口
for (int i = 0; i < 5; i++) {
Thread thread = new Thread(seller, "窗口" + (i + 1));
if (i == 2) { // 第三个窗口的优先级最高
thread.setPriority(Thread.MAX_PRIORITY);
}
thread.start();
}
}
}
```