有一个水池,水池的容量是固定 的500L,一边为进水口,一边为出水口.要求,进水与放水不能同时进行.
水池一旦满了不能继续注水,一旦放空了,不可以继续放水. 进水的速度5L/s , 放水的速度2L/s。
本例类似生产者和消费者,但又不同,生产者消费者是生产一个就消费一个,线程交替执行,但本例,进水和放水不能交替进行,必须等水池为空才进水,水池满才能放水
class Pool {
int waterYield = 50;// 水池容量
int water;// 现有水量
int addWaterSpeed = 5;// 进水速度5L/s
int outWaterSpeed = 2;// 出水速度
public Pool() {
}
public Pool(int water) {
this.water = water;
}
}
class InWater implements Runnable {
Pool pool ;
public InWater() {
}
public InWater(Pool pool) {
this.pool = pool;
}
@Override
public void run() {
synchronized (pool) {
while (pool.waterYield > pool.water) {
pool.water += pool.addWaterSpeed;
System.out.println("每秒进5升水");
}
System.out.println(pool.water + "水池满了");
}
}
}
class OutWater implements Runnable {
Pool pool = new Pool(50);
public OutWater() {
}
public OutWater(Pool pool) {
this.pool = pool;
}
@Override
public void run() {
synchronized (pool) {
while (pool.water > 0) {
pool.water -= pool.outWaterSpeed;
System.out.println("水池每秒放2L水");
}
System.out.println(pool.water + "水池空了");
}
}
}
public class Ex2 {
public static void main(String[] args) {
Pool pool = new Pool(30);
InWater inw = new InWater(pool);
OutWater outw = new OutWater(pool);
Thread t1 = new Thread(inw);
Thread t2 = new Thread(outw);
t1.start();
t2.start();
}
}
我在代码中设定的是一个已经有30L水的水池,故,只需要执行四次进水,水池就满了,OutWater就可以开始放水了。
定义水池初始水量就是50,先出水,水池空了才会加水,
定义初始水量是0,先判断水池为空,再进水,满了再出水