Java多线程 多个生产者和多个消费者实现同步 jdk1.5

来源:互联网 发布:windows小技巧 编辑:程序博客网 时间:2024/05/19 01:14

 jdk1.5用Lock和Condition  代替  jdk1.4  synchronized、wait、notify

package test;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;class Person {}/* 程序说明:2个生产者,2个消费者, 生产一个商品,消费一个商品(商品有标号) jdk1.5用Lock和Condition  代替  jdk1.4  synchronized、wait、notify */class Resource {private String name = "";private int count = 1;private boolean flag = false;private Lock lock = new ReentrantLock();private Condition condition = lock.newCondition();public void produce(String name) {lock.lock();try {while (flag)// 注意判断标记用while,每次线程唤醒都要先判断标记condition.await();this.name = name + "--" + count++;System.out.println(Thread.currentThread().getName()+ ":   生产者....." + this.name);flag = true;condition.signalAll();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {lock.unlock(); // 如果程序出现异常,处理完异常后必须释放锁,所以要用finally}}public synchronized void consume() {lock.lock();try {while (!flag)// 注意判断标记用while,每次线程唤醒都要先判断标记condition.await();System.out.println(Thread.currentThread().getName()+ ":   消费者.........." + this.name);flag = false;condition.signalAll();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {lock.unlock();}}}class Producer implements Runnable {private Resource res;Producer(Resource res) {this.res = res;}public void run() {while (true) {res.produce("商品");}}}class Consumer implements Runnable {private Resource res;Consumer(Resource res) {this.res = res;}public void run() {while (true) {res.consume();}}}public class Test {public static void main(String[] args) {Resource res = new Resource();Producer producer = new Producer(res);Consumer consumer = new Consumer(res);Thread t1 = new Thread(producer);Thread t2 = new Thread(producer);Thread t3 = new Thread(consumer);Thread t4 = new Thread(consumer);t1.start();t2.start();t3.start();t4.start();}}




用jdk1.5的新特性  解决当前问题

import java.util.concurrent.locks.*;class ProducerConsumerDemo2 {public static void main(String[] args) {Resource r = new Resource();Producer pro = new Producer(r);Consumer con = new Consumer(r);Thread t1 = new Thread(pro);Thread t2 = new Thread(pro);Thread t3 = new Thread(con);Thread t4 = new Thread(con);t1.start();t2.start();t3.start();t4.start();}}/*JDK1.5 中提供了多线程升级解决方案。将同步Synchronized替换成现实Lock操作。将Object中的wait,notify notifyAll,替换了Condition对象。该对象可以Lock锁 进行获取。该示例中,实现了本方只唤醒对方操作。Lock:替代了Synchronizedlock unlocknewCondition()Condition:替代了Object wait notify notifyAllawait();signal();signalAll();*/class Resource{private String name;private int count = 1;private boolean flag = false;//  t1    t2private Lock lock = new ReentrantLock();private Condition condition_pro = lock.newCondition();private Condition condition_con = lock.newCondition();public  void set(String name)throws InterruptedException{lock.lock();try{while(flag)condition_pro.await();//t1,t2this.name = name+"--"+count++;System.out.println(Thread.currentThread().getName()+"...生产者.."+this.name);flag = true;condition_con.signal();}finally{lock.unlock();//释放锁的动作一定要执行。}}//  t3   t4  public  void out()throws InterruptedException{lock.lock();try{while(!flag)condition_con.await();System.out.println(Thread.currentThread().getName()+"...消费者........."+this.name);flag = false;condition_pro.signal();}finally{lock.unlock();}}}class Producer implements Runnable{private Resource res;Producer(Resource res){this.res = res;}public void run(){while(true){try{res.set("+商品+");}catch (InterruptedException e){}}}}class Consumer implements Runnable{private Resource res;Consumer(Resource res){this.res = res;}public void run(){while(true){try{res.out();}catch (InterruptedException e){}}}}


0 0
原创粉丝点击