生產者/消費者問題
題目描述:
生產者(Productor)將產品交給店員(Clerk),而消費者(Customer)從店員處取走產品,店員一次只能持有固定數量的產品(比如,20),如果生產者試圖生產更多的產品。店員會叫生產者停一下,如果店中有空位放產品了再通知生產者繼續生產;如果店中沒有產品了,店員會告訴消費者等一下,如果店中有產品了再通知消費者來取走產品。
分析:
1.是否涉及到多線程?生產者和消費者。
2.是否涉及到共享數據?產品的數量,考慮線程的安全。
3.是否涉及線程的通信?存在着生產者和消費者的通信。
代碼:
class Clerk {//店員
int product;//產品數
public synchronized void addProduct(){//生產產品
if(product >= 20){
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else{
product++;
System.out.println(Thread.currentThread().getName() + "生產了第" + product + "個產品。");
notifyAll();
}
}
public synchronized void consumeProducet(){//消費產品
if(product <= 0){
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else{
product--;
System.out.println(Thread.currentThread().getName() + "消費了第" + product + "個產品。");
notifyAll();
}
}
}
class Producer implements Runnable{//生產者
Clerk clerk;
public Producer(Clerk clerk){
this.clerk = clerk;
}
public void run(){
System.out.println("生產者開始生產產品!");
while(true){
try {
Thread.currentThread().sleep(250);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
clerk.addProduct();
}
}
}
class Consumer implements Runnable{
Clerk clerk;
public Consumer(Clerk clerk){
this.clerk = clerk;
}
public void run(){
System.out.println("消費者開始消費產品!");
while(true){
try {
Thread.currentThread().sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
clerk.consumeProducet();
}
}
}
public class TestProduceConsume {
public static void main(String[] args) {
Clerk clerk = new Clerk();
Producer p1 = new Producer(clerk);
Consumer c1 = new Consumer(clerk);
Thread t1 = new Thread(p1);
Thread t2 = new Thread(c1);
t1.setName("生產者1");
t2.setName("消費者1");
t1.start();
t2.start();
}
}