问题
1.生产者(Producer)将产品给店员(Clerk),而消费者(Customer)从店员处取走产品,店员一次只能持有固定数量的产品(比如:20) ,如果生产者试图生产更多的产品,店员会叫生产者停一下,如果店中有空位放产品了再通知生产者继续生产;如果店中没有产品了,店员会告诉消费者等一下,如果店中有产品再通知消费者类取走产品
2.生产者比消费者快时,消费者会漏掉一些数据没有取到
3.消费者比生产者快时,消费者会取相同的数据
分析
1.是否是多线程问题?是,生产者线程,消费者线程
2.是否有共享数据?是,店员(或产品)
3.如果解决线程安全问题?同步机制,3种方法
4.是否涉及线程的通信?是
代码
public class Clerk {
private int count=0;
//生产产品
public synchronized void produceProduct() {
if(count<20) {
++count;
System.out.println(Thread.currentThread().getName()+"开始生产第"+count+"个产品");
notify();
}else {
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//消费产品
public synchronized void comsumeProduct() {
if(count>0) {
System.out.println(Thread.currentThread().getName()+"开始消费第"+count+"个产品");
--count;
notify();
}else {
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public class Producer extends Thread{
private Clerk clerk;
public Producer(Clerk clerk) {
this.clerk=clerk;
}
@Override
public void run() {
// System.out.println(getName()+":"+"开始生产产品....");
while(true) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
clerk.produceProduct();
}
}
}
public class Comsumer extends Thread{
private Clerk clerk;
public Comsumer(Clerk clerk) {
this.clerk=clerk;
}
@Override
public void run() {
while(true) {
// System.out.println("开始消费产品......");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
clerk.comsumeProduct();
}
}
}
public class ProductTest {
public static void main(String[] args) {
Clerk clerk=new Clerk();
Producer p1=new Producer(clerk);
p1.setName("Producer 1:");
Producer p2=new Producer(clerk);
p2.setName("Producer 2:");
Comsumer c1=new Comsumer(clerk);
c1.setName("Comsumer 1:");
p1.start();p2.start();
c1.start();
}
}
运行结果:生产者比消费者多,所以生产得快
Producer 2:开始生产第1个产品
Producer 1:开始生产第2个产品
Comsumer 1:开始消费第2个产品
Producer 2:开始生产第2个产品
Comsumer 1:开始消费第2个产品
Producer 1:开始生产第2个产品
Producer 1:开始生产第3个产品
Producer 2:开始生产第4个产品
Comsumer 1:开始消费第4个产品
Producer 1:开始生产第4个产品
Producer 2:开始生产第5个产品
Comsumer 1:开始消费第5个产品
Comsumer 1:开始消费第4个产品
Producer 1:开始生产第4个产品
Producer 2:开始生产第5个产品
Comsumer 1:开始消费第5个产品
Producer 1:开始生产第5个产品
Producer 2:开始生产第6个产品
Producer 1:开始生产第7个产品
Comsumer 1:开始消费第7个产品
Producer 2:开始生产第7个产品
Comsumer 1:开始消费第7个产品
Producer 2:开始生产第7个产品
Producer 1:开始生产第8个产品
Producer 1:开始生产第9个产品
Comsumer 1:开始消费第9个产品
Producer 2:开始生产第9个产品
Producer 1:开始生产第10个产品
Producer 2:开始生产第11个产品