取水:
主部分:
package a0506.Test3;
import java.util.Random;
public class Test3 {
public static void main(String[] args) {
Well2 well2=new Well2(10);
WellThread Zs=new WellThread("------张三------",well2,new Random().nextInt(5));
WellThread Ls=new WellThread("------李四------",well2,new Random().nextInt(6));
WellThread Ww=new WellThread("------王五------",well2,new Random().nextInt(8));
WellThread Tt=new WellThread("------桃桃------",well2,new Random().nextInt(3));
Zs.start();
Ls.start();
Ww.start();
Tt.start();
try {
Ls.join();//当前线程main要等待Ls线程run方法运行完才可以继续执行(也就是下面那条输出剩余水量语句)
Zs.join();//当前线程main要等待Zs线程run方法运行完才可以继续执行(也就是下面那条输出剩余水量语句)
Ww.join();//当前线程main要等待Ww线程run方法运行完才可以继续执行(也就是下面那条输出剩余水量语句)
Tt.join();//当前线程main要等待Tt线程run方法运行完才可以继续执行(也就是下面那条输出剩余水量语句)
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("剩余水量: "+well2.getWaterSize());
}
}
水井:
package a0506.Test3;
import java.util.concurrent.locks.ReentrantLock;
public class Well2 {
private int waterSize;
private final ReentrantLock lock=new ReentrantLock();
public Well2(int waterSize) {
this.waterSize = waterSize;
}
public void fetchWater(int number){
lock.lock();
try {
if (number > this.waterSize) {
System.out.println("剩余水量: " + this.waterSize + ",不能供应: " + number + Thread.currentThread().getName() + "没有水喝");
} else {
System.out.println(Thread.currentThread().getName() + "取走水量:" + number);
this.waterSize -= number;
System.out.println("剩余水量: " + this.waterSize);
}
}finally{
lock.unlock();
}
}
public int getWaterSize(){
return this.waterSize;
}
}
取水线程:
package a0506.Test3;
public class WellThread extends Thread{
private Well2 well;
private int number;
public WellThread(String name, Well2 well, int number) {
super(name);
this.well = well;
this.number = number;
}
public void setNumber(int number) {
this.number = number;
}
public int getSize(){
return this.well.getWaterSize();
}
@Override
public void run() {
this.well.fetchWater(number);
}
}
理解:
感觉之前写的代码并没有很好的体现面向对象这个问题;
先分析一下这个代码:
分了三个类,水井类有水量,还有一个方法(传入一个参数要取多少水)用来反应取水的情况(实际来看水井确实只需要知道一个水量就可以了,可以反应剩下多少水等等)取水的线程类有线程名字(谁取水)取水量(取多少水),水井(在哪个水井取水)然后run()方法里面就可以写去这个水井里面去取水
感觉这个思路就很清晰,感觉自己之前写的代码一点逻辑都没有糊上去的。以后多加改正