用Java实现
时间: 2024-02-12 22:06:59 浏览: 24
好的,下面是用 Java 实现的代码:
```java
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class Pond {
private int capacity;
private int currentWaterLevel;
private Lock lock;
public Pond(int capacity) {
this.capacity = capacity;
this.currentWaterLevel = 0;
this.lock = new ReentrantLock();
}
public void injectWater(int amount) {
lock.lock();
if (isFull()) {
System.out.println("Water pond is already full!");
} else {
currentWaterLevel += amount;
System.out.println("Injected " + amount + " units of water into the pond. Current water level: " + currentWaterLevel);
}
lock.unlock();
}
public void drainWater(int amount) {
lock.lock();
if (isEmpty()) {
System.out.println("Water pond is already empty!");
} else {
currentWaterLevel -= amount;
System.out.println("Drained " + amount + " units of water from the pond. Current water level: " + currentWaterLevel);
}
lock.unlock();
}
public boolean isFull() {
return currentWaterLevel == capacity;
}
public boolean isEmpty() {
return currentWaterLevel == 0;
}
}
class Injection extends Thread {
private Pond pond;
private int amount;
public Injection(Pond pond, int amount) {
this.pond = pond;
this.amount = amount;
}
public void run() {
pond.injectWater(amount);
}
}
class Drain extends Thread {
private Pond pond;
private int amount;
public Drain(Pond pond, int amount) {
this.pond = pond;
this.amount = amount;
}
public void run() {
pond.drainWater(amount);
}
}
public class Main {
public static void main(String[] args) {
Pond pond = new Pond(100);
Injection injection = new Injection(pond, 50);
Drain drain = new Drain(pond, 25);
injection.start();
drain.start();
try {
injection.join();
drain.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
```
在 Java 中,我们使用了 `java.util.concurrent.locks.Lock` 接口和 `java.util.concurrent.locks.ReentrantLock` 类来实现线程同步。和 Python 版本类似,我们在 `injectWater()` 和 `drainWater()` 方法中获取锁,确保同一时间只有一个线程可以修改水塘的水位高度。由于 Java 中的锁需要手动释放,我们在 `lock()` 方法之后使用了 `unlock()` 方法释放锁。
最后,我们在 `main()` 方法中创建一个 `Pond` 对象,然后创建一个注水线程和一个排水线程,分别进行注水和排水操作。我们还使用了 `join()` 方法等待线程执行完毕。