测试入口:
/**
* 多线程程序:模拟2个生产者生产产品,3个消费者消费产品;2个生产者不停的生产商品,3个消费者不停的消费产品
* @author Smilexs
*
*/
public class Test {
public static void main(String[] args) {
Resoures r = new Resoures();
Thread pro1= new Thread(new Producer(r),"生成者1号");
Thread pro2= new Thread(new Producer(r),"生成者2号");
Thread con1= new Thread(new Consumer(r),"消费者1号");
Thread con2= new Thread(new Consumer(r),"消费者2号");
Thread con3= new Thread(new Consumer(r),"消费者3号");
pro1.start();
pro2.start();
con1.start();
con2.start();
con3.start();
}
}
涉及源码:
public class Resoures {
private int count=1;//生产次数
private Lock lock = new ReentrantLock();//对象锁,保证线程安全
private Condition con = lock.newCondition();//锁的监视器
private boolean flag= false;
public static boolean isStop = false;
public static int produceCount = 300;//总的生成量
public int getCount(){
return count;
}
/**
* 生产
* @param productName
*/
public void produce(String productName){
lock.lock();//获得对象锁
while(flag){
//flag = true:通知消费
try {
con.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//flag= flase时:生产
System.out.println(Thread.currentThread().getName() +":生产了第"+count+"台"+productName);
count++;
flag = true;
con.signalAll();
lock.unlock();
}
/**
* 消费
*/
public void consume(){
lock.lock();
while(!flag){
try {
//flag=flase,通知生产
con.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//flag=true,消费
flag=false;
System.out.println(Thread.currentThread().getName() +":购买了第"+(count-1)+"台");//生产后,count为下一台的记号
con.signalAll();
lock.unlock();
}
}
/**
* 生成者
*/
public class Producer implements Runnable{
private Resoures resoures = null;//同一份资源
public Producer(Resoures resoures) {
this.resoures = resoures;
}
@Override
public void run() {
while(resoures.getCount()< resoures.produceCount ){
resoures.produce("iphone 6s");
}
resoures.isStop = true;
}
}
/**
* 消费者
*/
public class Consumer implements Runnable{
private Resoures resoures = null;
public Consumer(Resoures resoures ) {
this.resoures =resoures;
}
@Override
public void run() {
while(!resoures.isStop){
resoures.consume();
}
}
}
结果展示:
。。