java 多线程之生产者消费者模式
package com.test;
public class Test3 {
public static void main(String[] args) throws InstantiationException, IllegalAccessException {
Box box=new Box();
producers p1=new producers(box);
consumers p2=new consumers(box);
new Thread(p1).start();
new Thread(p2).start();
}
}
//产品类
class ManTou {
private int id;
public ManTou(int id) {
this.id = id;
}
@Override
public String toString() {
return "id=" + id;
}
}
//容器类
class Box {
private int index = 0;
ManTou[] arr = new ManTou[8];
public synchronized void push(ManTou mt) {
while (index == arr.length) {
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
this.notify();
arr[index] = mt;
index++;
}
public synchronized ManTou getManTou() {
if(index == 0) {
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
this.notify();
index--;
return arr[index];
}
}
//生产者
class producers implements Runnable {
private Box box ;
public producers(Box box) {
this.box = box;
}
@Override
public void run() {
for (int i = 0; i <10; i++) {
ManTou mt = new ManTou(i);
try {
box.push(mt);
System.out.println("生产一个:"+mt);
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
//消费者
class consumers implements Runnable {
private Box box = null;
public consumers(Box box) {
this.box = box;
}
@Override
public void run() {
for (int i = 0; i <10; i++) {
ManTou mt;
try {
mt = box.getManTou();
System.out.println("取走一个:"+mt);
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}