有多个生产者和多消费者的时候
问题1: 会同时生产多个或者同时消费多个,达不到生产一只就消费一只的目的
原因 : 当前任务下的线程再次唤醒后没有继续判断标记
办法 : 在线程进入判断标记 碰到wait后,再次唤醒还要继续判断标记
将if改成while
问题2 : 将if改成while后 ,线程死锁了..
原因 : 线程每次唤醒了同一任务下的线程,就产生死锁
办法 : 将线程池中等待的线程全部唤醒
notify --> notifyAll();
更好的来优化 多生产者和多消费者的问题(JAVA当中的多态锁)
* Java 提供了一个多态锁 ReentrantLock(可重入的互斥锁)
支持Condition对象 监视器当前的环境对象
Condition提供了三个方法
await() -----> wait
signal() -----> notify()
signalAll() -----> notifyAll()
try
尝试着执行一段代码,在使用资源(做数据库的操作,对流的操作...)
catch
抓去异常,解决问题
finally
必须执行的 释放资源(关闭数据库连接,关闭ResultSet.关闭流对象..)
多消费者多生产者多态锁运用
class KFC {
Lock lock = new ReentrantLock();
//创建俩个监视器
Condition chiefCon = lock.newCondition();
Condition customerCon = lock.newCondition();
private String foodName;
private int count;//数量
private boolean flag = false;
/**
* 生产食物
*/
public void put(String foodName){//
lock.lock();//锁上了
try{
while(flag)
try {chiefCon.await();} catch (InterruptedException e) {}
count++;
this.foodName = "第" + count +"份"+ foodName;
System.out.println(Thread.currentThread().getName() + "生产了" + this.foodName);
flag = true;
customerCon.signal();
}finally{
lock.unlock();//释放锁
}
}
/**
* 消费食物
*/
public void take(){
lock.lock();
try{
while(!flag)
try {customerCon.await();} catch (InterruptedException e) {}
System.out.println(Thread.currentThread().getName() + "...消费了" + foodName);
flag = false;
chiefCon.signal();
}finally{
lock.unlock();
}
}
}
class Chief implements Runnable{
private KFC kfc;
public Chief(KFC kfc) {
this.kfc = kfc;
}
@Override
public void run() {
while(true){
kfc.put("XX烤翅");
}
}
}
class Customer implements Runnable{
private KFC kfc;
public Customer(KFC kfc) {
this.kfc = kfc;
}
@Override
public void run() {
while(true){
kfc.take();
}
}
}
/**
* 有多个生产者和多消费者的时候
*
* 问题1: 会同时生产多个或者同时消费多个,达不到生产一只就消费一只的目的
* 原因 : 当前任务下的线程再次唤醒后没有继续判断标记
* 办法 : 在线程进入判断标记 碰到wait后,再次唤醒还要继续判断标记
* 将if改成while
*
* 问题2 : 将if改成while后 ,线程死锁了..
* 原因 : 线程每次唤醒了同一任务下的线程,就产生死锁
* 办法 : 将线程池中等待的线程全部唤醒
* notify –> notifyAll();
*
* 更好的来优化 多生产者和多消费者的问题
*
* java中的多态锁..
*
* @author Administrator
*
*/
public class KFCTest2{
public static void main(String[] args) {
KFC kfc = new KFC();
Chief chief1 = new Chief(kfc);
Chief chief2 = new Chief(kfc);
Customer customer1 = new Customer(kfc);
Customer customer2 = new Customer(kfc);
Thread t1 = new Thread(chief1);
Thread t2 = new Thread(chief2);
Thread t3 = new Thread(customer1);
Thread t4 = new Thread(customer2);
t1.start();
t2.start();
t3.start();
t4.start();
}
}