一,问题:生产者将生产出来的产品放入仓库中(仓库的容量为10),而消费者从仓库中取走产品(当仓库的产品数量为0时,不能取产品).使用多线程方法解答.
以下是我写的解法:有四个文件组成.
Cangku.java
package com.procom.java;
public class Cangku {
public synchronized void addProduct() //生产者
{
if(this.products>=10)
{
try
{
this.wait();
}catch(InterruptedException e)
{
e.printStackTrace();
}
}
else
{
products++;
System.out.println("生产者生产第"+products+"个产品");
this.notifyAll();
}
}
public synchronized void getProduct() //消费者
{
if(this.products<=0)
{
try
{
this.wait();
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
else
{
System.out.println("消费者取走了第"+products+"个产品");
products--;
this.notifyAll();
}
}
private int products=0;
}
Producer.java
package com.procom.java;
public class Producer implements Runnable {
public Producer(Repertory repertory)
{
this.repertory=repertory;
}
public void run()
{
System.out.println("生产者开始生产产品");
while(true)
{
try
{
Thread.sleep((int)(Math.random()*10)*100);
}catch(InterruptedException e)
{
e.printStackTrace();
}
repertory.addProduct();
}
}
private Repertory repertory;
}
Consumer.java
package com.procom.java;
public class Consumer implements Runnable{
public Consumer(Repertory repertory)
{
this.repertory=repertory;
}
public void run()
{
System.out.println("消费之开始取走产品");
while(true)
{
try
{
Thread.sleep((int)(Math.random()*10)*100);
}catch(InterruptedException e)
{
e.printStackTrace();
}
repertory.getProduct();
}
}
private Repertory repertory;
}
Test1.java
package com.procom.java;
public class Test1 {
public static void main(String [] args)
{
Cangku cangku=new Cangku();
Producer pr1=new Producer(cangku);
Consumer co1=new Consumer(cangku);
Thread th1=new Thread(pr1);
Thread th2=new Thread(co1);
th1.start();
th2.start();
}
}