Java中的生产者消费者问题(多线程间同步通信)
来源:互联网 发布:资料员软件价格 编辑:程序博客网 时间:2024/05/18 04:12
JDK1.5之前的版本
<strong><span style="font-size:18px;">class ProducerConsumerDemo {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();}}/*对于多个生产者和消费者。为什么要定义while判断标记。原因:让被唤醒的线程再一次判断标记。为什么定义notifyAll,因为需要唤醒对方线程。因为只用notify,容易出现只唤醒本方线程的情况。导致程序中的所有线程都等待。*/class Resource{private String name;private int count = 1;private boolean flag = false;// t1 t2public synchronized void set(String name){while(flag)try{this.wait();}catch(Exception e){}//t1(放弃资格) t2(获取资格)this.name = name+"--"+count++;System.out.println(Thread.currentThread().getName()+"...生产者.."+this.name);flag = true;this.notifyAll();}// t3 t4 public synchronized void out(){while(!flag)try{wait();}catch(Exception e){}//t3(放弃资格) t4(放弃资格)System.out.println(Thread.currentThread().getName()+"...消费者........."+this.name);flag = false;this.notifyAll();}}class Producer implements Runnable{private Resource res;Producer(Resource res){this.res = res;}public void run(){while(true){res.set("+商品+");}}}class Consumer implements Runnable{private Resource res;Consumer(Resource res){this.res = res;}public void run(){while(true){res.out();}}}</span></strong>
JDK1.5以后版本
<strong><span style="font-size:18px;">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){}}}}</span></strong>
0 0
- Java中的生产者消费者问题(多线程间同步通信)
- java多线程同步:生产者与消费者问题
- 多线程间通信 生产者消费者问题
- 【java 多线程】多线程并发同步问题及生产者、消费者问题
- java生产者消费者多线程同步
- java多线程同步以及线程间通信详解&消费者生产者模式&死锁&Thread.join()(多线程编程之二)
- java多线程同步以及线程间通信详解&消费者生产者模式&死锁&Thread.join()(多线程编程之二)
- java中的生产者与消费者问题(多线程)
- 多线程同步中的生产者消费者问题 - windows 平台实现
- 线程通信,生产者消费者问题(Java)
- java生产者消费者同步问题
- java实现 生产者和消费者问题 多线程同步示例
- Java多线程同步——生产者消费者问题
- Java多线程同步——生产者消费者问题
- 生产者消费者问题(Java多线程)
- Java线程间通信问题分析(生产者消费者模型)
- java多线程 生产者消费者问题
- java多线程 生产者 消费者 问题 。。。
- 关于AFNetworking菊花转圈圈的问题
- 一个小小的编程感悟
- c编程:数据对齐
- fatal error: file '/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Dev
- Java NIO使用及原理分析 (四)
- Java中的生产者消费者问题(多线程间同步通信)
- 《Java虚拟机原理图解》 1.2、class文件中的常量池
- 集线器,路由器,交换机的作用和区别是什么?如何区分交换机,集线器,路由器?
- 查看so库的方法
- 交换机,集线器,路由器这三者怎样区分,各自的作用是什么?
- 《Java虚拟机原理图解》 1.2.2、Class文件中的常量池详解(上)
- 《unix高级环境编程》进程间通信——信号量
- C/C++枚举注册表某项下的所有键值【代码示例】
- linux下提示bash:command not found