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(进水),当水池满时,进水线程阻塞,并通知排水线程开始排水,当排完水时,应阻塞排水线程同时唤醒进水进程。