小白最近在学到java的多线程,遇到一个问题,求大神

package cn.zhang.java;

/*水池的容量是固定的500L,一边为进水口,一边为出水口.
要求,进水与放水不能同时进行.水池一旦满了不能继续注水,一旦放空了,不可以继续放水. 进水的速度5L/s , 放水的速度2L/s

*/
class Poool{
static int volome =0;
boolean flag=true;
}

// 定义进水口
class In extends Thread{
Poool p;
int inwater;
public In(Poool p){
this.p=p;
}
@Override
public void run() {
while(true){
synchronized (p) {
if(p.flag==true||inwater<500){

System.out.println("加水中,加了:"+inwater);
p.flag=false;
inwater+=5;
p.notify();
}else {
try {
p.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

        }
    }
}
}   

}
// 定义出水口
class Out extends Thread{
Poool p;
int outwater;
public Out(Poool p){
this.p=p;

}
@Override
public void run() {
while(true){
synchronized (p) {
if(p.flag==false){
if(p.flag==false||outwater>0){
System.out.println("放水中,放了:"+outwater);

p.flag=true;
outwater-=2;
p.notify();
}else{
try {
p.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

        }
        }


    }
}

}

public class Do1 {
public static void main(String[] args) {
Poool p=new Poool();
In in =new In(p);
Out out = new Out(p);
in.start();
out.start();
}

}

3个回答

输出:
水中,加了:151225
放水中,放了:-60294
加水中,加了:151230
放水中,放了:-60296
加水中,加了:151235
放水中,放了:-60298
加水中,加了:151240
。。。。。
感觉往两个方向走了,写了一下午,一直没弄明白、

不是不能同时进水和出水吗,两个线程是同时运行的

qq_34544496
练小芽 回复qq_34544496: 3.pool类里边的那个 volome对象你并没有使用,也就是说,你只是在模拟加水放水的过程却没有真的将水加到水池里边
接近 4 年之前 回复
qq_34544496
练小芽 回复qq_34544496: 2.你的判定条件有点问题,我写了一个你看看if(p.flag==true){ inWater+=5; System.out.println("加水中,加了:"+inWater); if(inWater>=500){ p.flag=false; p.notify(); inWater=0; } }else { try { p.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
接近 4 年之前 回复
qq_34544496
练小芽 回复java_xiaodi: 不好意思,上次没仔细看,这次我仔细看了,发现有几个问题:1. inwater和outwater没有赋值,由于他们没有赋值,他们在Thread创建的时候会被给出不定值
接近 4 年之前 回复
java_xiaodi
java_xiaodi 回复qq_34544496: 我用了wait 方法 修饰它 ,难道是位置不对嘛?望明示
接近 4 年之前 回复
java_xiaodi
java_xiaodi 回复qq_34544496: 我用了wait 方法 修饰它 ,难道是位置不对嘛?望明示
接近 4 年之前 回复
java_xiaodi
java_xiaodi 回复qq_34544496: 我用了wait 方法 修饰它 ,难道是位置不对嘛?望明示
接近 4 年之前 回复

inwater 和outwater,你这写的,貌似没关系吧!独立的两个变量!所以一直往两个方向走啊!
另外:
if(p.flag==true||inwater if(p.flag==false||outwater>0){ //这行应该改成if(p.flag==false||outwater>0){
要不你这代码没意义啊!

java_xiaodi
java_xiaodi 回复AGS-wangdsh: 我再试试看 谢谢了!
接近 4 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问