理发店问题,一个理发店有一个n把椅子的等待室和一个有一把理发椅的理发室,如果没有顾客,理发师就去睡觉,如果各科来时所有的椅子都有人,那么顾客离去,如果理发师在忙而有空闲的椅子,那么顾客会坐在其中一把空闲的椅子上,如果理发师在睡觉,顾客摇醒他。编写一个程序使用java同步来协调理发师和顾客
时间: 2024-02-18 08:06:17 浏览: 148
好的,关于使用Java同步来协调理发师和顾客,你可以参考以下步骤:
1. 定义锁和条件变量
使用Java提供的Lock和Condition类定义锁和条件变量,用于控制顾客和理发师之间的同步:
```java
Lock lock = new ReentrantLock();
Condition barberAvailable = lock.newCondition();
Condition customerAvailable = lock.newCondition();
```
2. 定义理发店状态
定义理发店状态,包括理发师是否忙碌、等待室中的空闲椅子数量、等待室中的顾客数量:
```java
boolean barberBusy = false;
int freeWaitingChairs = n;
int waitingCustomers = 0;
```
3. 定义线程
定义两个线程,一个代表理发师,一个代表顾客:
```java
class Barber extends Thread {
public void run() {
while (true) {
try {
lock.lock();
// 如果没有顾客,则理发师休息
while (waitingCustomers == 0) {
System.out.println("Barber is sleeping");
barberAvailable.await();
}
// 取出一个顾客进行理发
waitingCustomers--;
freeWaitingChairs++;
barberBusy = true;
System.out.println("Barber is cutting hair");
sleep(3000);
barberBusy = false;
// 理发完成,通知顾客
customerAvailable.signal();
lock.unlock();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Customer extends Thread {
public void run() {
try {
lock.lock();
// 如果没有空闲的椅子,则离开
if (freeWaitingChairs == 0) {
System.out.println("Customer is leaving");
lock.unlock();
return;
}
// 如果理发师在忙,但有空闲椅子,则等待
if (barberBusy) {
System.out.println("Customer is waiting");
waitingCustomers++;
customerAvailable.await();
waitingCustomers--;
}
// 等待室中有空闲椅子,顾客坐下等待
freeWaitingChairs--;
System.out.println("Customer is waiting in the waiting room");
barberAvailable.signal();
lock.unlock();
// 等待理发师理发
barberBusy = true;
lock.lock();
while (barberBusy) {
customerAvailable.await();
}
barberBusy = true;
lock.unlock();
// 理发完成,顾客离开
System.out.println("Customer is done with hair cut");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
```
4. 启动线程
在main函数中创建理发师和顾客线程,并启动:
```java
public static void main(String[] args) {
Barber barber = new Barber();
Customer customer1 = new Customer();
Customer customer2 = new Customer();
Customer customer3 = new Customer();
barber.start();
customer1.start();
customer2.start();
customer3.start();
}
```
这样就完成了使用Java同步来协调理发师和顾客的编写。在这个程序中,使用锁和条件变量控制顾客和理发师之间的同步,达到正确的理发店行为。
阅读全文