1.生产者与消费者模型:
生产者将产品交给店员,而消费者从店员这取走产品,店员一次只能持有固定的数量。如果生产者试图生产更多的产品,店员会叫生产者听一下,如果店中有空位放产品的话则通知生产者继续生产;如果店员没有产品了,店员会叫消费者等一下,如果店中有产品了再通知消费者取一下。
2.分析:
是否是多线程问题?是,生产者和消费者
是否有线程安全问题?就是说是否有共享数据,就是产品的质量
是否有线程间的通信?有,生产者与消费者的通信 。
这是一个关于多线程比较综合的问题,具体的代码如下:
public class ProducerConsumerTest {
public static void main(String[] args) {
Clerk clerk = new Clerk();
Producer producer = new Producer(clerk);
Consumer consumer = new Consumer(clerk);
Thread pro = new Thread(producer);
Thread con = new Thread(consumer);
pro.setName("生产者一");
con.setName("消费者一");
pro.start();
con.start();
}
}
//店员
class Clerk{
private int productCount;//产品的数量
//增加产品
public synchronized void addProduct(){
if (productCount >= 20){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else {
productCount++;
System.out.println(Thread.currentThread().getName()+"生产了第:"+productCount
+"产品");
notify();
}
}
//减少产品
public synchronized void reduceProduct(){
if (productCount <= 0){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
System.out.println(Thread.currentThread().getName()+"消费了第:"+productCount+"产品");
productCount--;
notify();
}
}
}
//生产者
class Producer implements Runnable{
Clerk clerk;
public Producer (Clerk clerk){
this.clerk = clerk;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"开始生产....");
while (true){
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
clerk.addProduct();
}
}
}
//消费者
class Consumer implements Runnable{
Clerk clerk;
public Consumer (Clerk clerk){
this.clerk = clerk;
}
@Override
public void run() {
while (true){
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"开始消费....");
clerk.reduceProduct();
}
}
}