理发店问题。一个理发店有一个有n把椅子的等待室和一个有一把理发椅的理发室。如果没有顾客,理发师就去睡觉。如果顾客来时所有的椅子上都有人,那么顾客离去。如果理发师在忙而有空闲的椅子,那么顾客会坐在其中一把空闲的椅子上。如果理发师在睡觉,顾客会摇醒他。编写一个程序使用Java同步来协调理发师和顾客。
时间: 2024-02-13 13:02:03 浏览: 111
好的,这是一个典型的生产者消费者问题,可以使用Java中的线程同步来解决。我们可以创建两个类:一个是理发师类,另一个是顾客类。代码如下:
```java
import java.util.concurrent.Semaphore;
public class BarberShop {
private static final int CHAIRS = 3; // 等待室中的椅子数量
private static Semaphore barber = new Semaphore(0); // 理发师信号量
private static Semaphore customer = new Semaphore(0); // 顾客信号量
private static Semaphore mutex = new Semaphore(1); // 互斥信号量
private static int waiting = 0; // 等待的顾客数量
public static void main(String[] args) {
Barber barber = new Barber();
barber.start();
for (int i = 1; i <= 10; i++) {
Customer customer = new Customer(i);
customer.start();
}
}
static class Barber extends Thread {
@Override
public void run() {
while (true) {
try {
// 等待顾客
System.out.println("理发师正在睡觉...");
barber.acquire();
// 理发
mutex.acquire();
waiting--;
customer.release();
mutex.release();
System.out.println("理发师正在理发...");
Thread.sleep(500); // 模拟理发的时间
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
static class Customer extends Thread {
private int id;
public Customer(int id) {
this.id = id;
}
@Override
public void run() {
try {
mutex.acquire();
if (waiting < CHAIRS) {
waiting++;
System.out.println("顾客" + id + "正在等待理发...");
barber.release();
mutex.release();
customer.acquire();
System.out.println("顾客" + id + "正在理发...");
} else {
mutex.release();
System.out.println("顾客" + id + "没有位置了,离开了。");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
```
在这个程序中,我们使用了三个信号量:barber、customer和mutex。barber和customer的初始值都是0,mutex的初始值是1。当顾客到达理发店时,它首先尝试获取mutex信号量,然后检查等待室中是否还有空位。如果有,它会增加等待顾客的数量,释放barber信号量并释放mutex信号量。如果等待室中没有空位,它只释放mutex信号量并离开理发店。当理发师要进行理发时,它首先尝试获取barber信号量,然后进行理发,最后释放customer信号量并释放mutex信号量。这样,等待的顾客就可以被唤醒并进行理发了。
这个程序可以正确地模拟理发店的行为,保证了顾客和理发师之间的同步。
阅读全文