java线程模拟水池进水_Java多线程中的进水与排水问题

Java本身支持多线程,要理解并运用好Java多线程机制并不是一件容易的事。在Java多线程中线程的同步是一个重点。

Java线程中的进水排水问题也可以看做是经典的生产者消费者问题,下面先列出完整的代码:

//WaterPool.java

package org.Demo.water;

class WaterPool {

private int water = 10;

public synchronized void bilging()//进水

{

if(this.isFull() == true)

{

System.out.println("水池已满,进水阻塞

");

try

{

super.notify();

super.wait();

}

catch(Exception

e)

{

e.printStackTrace();

}

}

else

{

try

{

Thread.sleep(1000);

}

catch(Exception

e)

{

e.printStackTrace();

}

this.water++;

System.out.println("开始进水,水池中的水量:water="+this.water);

}

}

public synchronized void dewatering()//排水

{

if(this.isEmpty() ==

true)

{

System.out.println("水池空,排水阻塞

");

try

{

super.notify();

super.wait();

}

catch(Exception

e)

{

e.printStackTrace();

}

}

else

{

try

{

Thread.sleep(1000);

}

catch(Exception

e)

{

e.printStackTrace();

}

this.water--;

System.out.println("开始排水,水池中的水量:water="+this.water);

}

}

public boolean

isFull() //水池满

{

if(water >=

10)

{

return

true;

}

else

{

return

false;

}

}

public boolean isEmpty()//水池空

{

if(water <=

0)

{

return

true;

}

else

{

return

false;

}

}

}

//InWater.java

package org.Demo.water;

class InWater implements Runnable{

WaterPool waterpool = null;

public InWater(WaterPool waterpool)

{

this.waterpool =

waterpool;

}

public void run()

{

for(int

i=0;i<20;i++)

{

waterpool.bilging();

}

}

} //OutWater.java

package org.Demo.water;

class OutWater implements Runnable {

WaterPool waterpool = null;

public OutWater(WaterPool waterpool)

{

this.waterpool =

waterpool;

}

public void run() {

for(int

i=0;i<20;i++)

{

waterpool.dewatering();

}

}

}

//Process.java

package org.Demo.water;

public class Process {

public static void main(String[] args) {

WaterPool waterpool = new

WaterPool();

InWater in = new

InWater(waterpool);

OutWater out = new

OutWater(waterpool);

new Thread(in).start();

new Thread(out).start();

}

}

打印结果:

水池已满,进水阻塞

开始排水,水池中的水量:water=9

开始排水,水池中的水量:water=8

开始排水,水池中的水量:water=7

开始排水,水池中的水量:water=6

开始排水,水池中的水量:water=5

开始排水,水池中的水量:water=4

开始排水,水池中的水量:water=3

开始排水,水池中的水量:water=2

开始排水,水池中的水量:water=1

开始排水,水池中的水量:water=0

水池空,排水阻塞

开始进水,水池中的水量:water=1

开始进水,水池中的水量:water=2

开始进水,水池中的水量:water=3

开始进水,水池中的水量:water=4

开始进水,水池中的水量:water=5

开始进水,水池中的水量:water=6

开始进水,水池中的水量:water=7

开始进水,水池中的水量:water=8

开始进水,水池中的水量:water=9

开始进水,水池中的水量:water=10

水池已满,进水阻塞

进水排水问题是一个非常简单的Java多线程同步的运用。假设有一个水池,池中有进水与排水两个孔,每次只能单独进水或排水,且进水或排水量为1立方米,现池中有10立方米的水,水池满时不能进水,只能排水,水池空时只能进水不能排水。用两个线程来模拟进水与排水,WaterPool类作为资源类,其中使用了同步方法dewatering(排水)和bilging(进水),当水池满时,进水线程阻塞,并通知排水线程开始排水,当排完水时,应阻塞排水线程同时唤醒进水进程。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值