利用互斥机制和同步机制实现,抢票过程,具体要求:张三线程买了5张票后,李四的线程再买5张票,两个线程执行有先后顺序
时间: 2023-05-24 22:04:39 浏览: 44
这个问题可以用Java中的ReentrantLock和Condition来实现。
具体代码如下:
```java
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class TicketSeller {
private static final int MAX_TICKETS = 10;
private int ticketsSold = 0;
private ReentrantLock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
public void sell(String name, int numTickets) {
lock.lock();
try {
// 等待张三先买票
while (name.equals("李四") && ticketsSold < 5) {
condition.await();
}
while (numTickets > 0) {
// 如果还有票
if (ticketsSold < MAX_TICKETS) {
// 卖一张票
ticketsSold++;
System.out.println(name + "买了一张票,当前票数为" + ticketsSold);
numTickets--;
} else {
// 没有票了
System.out.println("票已经卖完了");
break;
}
}
// 唤醒阻塞的线程
condition.signalAll();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public static void main(String[] args) {
TicketSeller seller = new TicketSeller();
Thread thread1 = new Thread(() -> seller.sell("张三", 5));
Thread thread2 = new Thread(() -> seller.sell("李四", 5));
thread1.start();
thread2.start();
}
}
```
在这个例子中,两个线程抢10张票,其中张三先买了5张票,然后李四再买5张票。
ReentrantLock和Condition的使用方式如下:
- 在卖票方法中,先调用lock()方法获取锁。
- 然后判断当前线程是否可以卖票,如果不行就调用condition.await()方法将线程阻塞等待。
- 如果可以卖票,则执行卖票逻辑。
- 最后调用condition.signalAll()方法唤醒所有阻塞的线程。
这样就可以保证张三先买了5张票,然后李四再买5张票的顺序了。