(五)—生产者消费者替换方案

最后更新于:2022-04-01 10:16:30

### java 在1.5之后提供了多线程升级解决方案 其中Synchronized被接口Lock所代替 Object中的wait notify notifyAll被 Condition接口中的方法所替代。 Lock类的介绍:----其中,Lock 替代了 synchronized 方法和语句的使用 lock:获取锁 unlock:释放锁 newCondition:返回Condition实例 Condition类的介绍:----Condition 替代了 Object 监视器方法的使用 await() 是线程等待,类似于wait方法。需要抛 signal() 唤醒一个等待的线程 signalAll() 唤醒所有等待的线程 ### 本例主要演示生产者、消费者这个经典案例的替换方案。 并学习Lock和Condition的方法 描述:生产者负责生产商品,消费者负责消费商品,其中生产者为空时不能,消费者不能进行消费。 实现步骤: 1、定义一个操作类方法:Resources类,属性:name,商品编号 count.标志 flag. 当flag为false时,表示生产者还未生成,这是需要执行生成方法。执行完后将flag设置为true。 并唤醒消费者去执行消费方法  当flag为true时,表示生产者已经生产一个产品,执行等待(await)操作。此时,消费者执行完消 费操作之后,将flag设置为false,并唤醒生产者执行生产方法。 void set(String name)方法,void out();方法。 2、生产者类:Producer实现Runnable接口,覆写run方法。Producer(Resources res),有参构造方法 3、消费者类:Consumer实现Runnabel接口,覆写run方法。Consumer(Resources res),有参构造方法 4、创建多个生产者、消费这线程。用来启动多线程 ~~~ import java.util.concurrent.locks.*; public class ProducerConsumer{ public static void main(String args[]){ Resources res = new Resources(); Producer pro = new Producer(res); Consumer con = new Consumer(res); Thread t1 = new Thread(pro); //生产者.. Thread t2 = new Thread(pro); //生产者.. Thread t3 = new Thread(pro); //生产者.. Thread t4 = new Thread(con); //生产者.. Thread t5 = new Thread(con); //生产者.. Thread t6 = new Thread(con); //生产者.. t1.start(); t2.start(); t3.start(); t4.start(); t5.start(); t6.start(); } } class Resources{ private String name; private int count=1; private boolean flag; private final Lock lock = new ReentrantLock(); //创建一个Lock的实例 private Condition condition_Pro = lock.newCondition(); //创建一个控制Producer线程的Condition实例 private Condition condition_Con = lock.newCondition();//创建一个控制Consumer线程的condition实例 public void set(String name)throws InterruptedException{ lock.lock(); //开启锁 try{ while(flag) //需要持续判断锁,如果为true,需要等待 condition_Pro.await(); //Producer线程等待。 this.name = name+"--"+(++count); System.out.println(Thread.currentThread().getName()+"...生产者..."+this.name); flag = true; condition_Con.signal(); //唤醒Customer的线程 }finally{ lock.unlock(); //无论程序是否执行完,都要释放资源 } } public void out()throws InterruptedException{ lock.lock(); try{ while(!flag) //当flag为false时,没有生成,消费者需要等待 condition_Con.await(); //消费者线程等待 System.out.println(Thread.currentThread().getName()+".......消费者........."+count); flag = false; condition_Pro.signal(); //唤醒Producer的线程 }finally{ lock.unlock(); } } } class Producer implements Runnable{ Resources res; public Producer(Resources res){ this.res = res; } public void run(){ //重复执行生产的方法 try{ while(true) res.set("lzl"); }catch(InterruptedException e){} } } class Consumer implements Runnable{ Resources res; public Consumer(Resources res){ this.res = res; } public void run(){ //重复执行消费的方法 try{ while(true) res.out(); }catch(InterruptedException e){} } } ~~~
';