java生产者和消费者案例
来源:互联网 发布:本周国内经济数据 编辑:程序博客网 时间:2024/06/05 02:45
一、同步方法
public class TestProductorAndConsumer { public static void main(String[] args) { // TODO Auto-generated method stub Clerk clerk = new Clerk(); Productor pro = new Productor(clerk); Consumer cus = new Consumer(clerk); new Thread(pro, "生产者A").start(); new Thread(cus, "消费者B").start(); new Thread(pro, "生产者C").start(); new Thread(cus, "消费者D").start(); }}// 店员class Clerk { private int product = 0; // 进货 public synchronized void get() { while (product >= 1) { //为了避免虚假唤醒问题 System.out.println("产品已满"); try { this.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.println(Thread.currentThread().getName() + ":" + ++product); this.notifyAll(); } // 卖货 public synchronized void sale() { while (product <= 0) { System.out.println("缺货"); try { this.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.println(Thread.currentThread().getName() + ":" + --product); this.notifyAll(); }}// 生产者class Productor implements Runnable { private Clerk clerk; public Productor(Clerk clerk) { super(); this.clerk = clerk; } @Override public void run() { // TODO Auto-generated method stub for (int i = 0; i < 20; i++) { try { Thread.sleep(200); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } clerk.get(); } }}// 消费者class Consumer implements Runnable { private Clerk clerk; public Consumer(Clerk clerk) { super(); this.clerk = clerk; } @Override public void run() { // TODO Auto-generated method stub for (int i = 0; i < 20; i++) { clerk.sale(); } }}
二、Lock方式
public class TestProductorAndConsumerForLock { public static void main(String[] args) { // TODO Auto-generated method stub ClerkLock clerk = new ClerkLock(); ProductorLock pro = new ProductorLock(clerk); ConsumerLock cus = new ConsumerLock(clerk); new Thread(pro, "生产者A").start(); new Thread(cus, "消费者B").start(); new Thread(pro, "生产者C").start(); new Thread(cus, "消费者D").start(); }}// 店员class ClerkLock { private int product = 0; private Lock lock = new ReentrantLock(); private Condition condition = lock.newCondition(); // 进货 public void get() { lock.lock(); try { while (product >= 1) { // 为了避免虚假唤醒问题 System.out.println("产品已满"); try { condition.await(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.println(Thread.currentThread().getName() + ":" + ++product); condition.signalAll(); } finally { lock.unlock(); } } // 卖货 public void sale() { lock.lock(); try { while (product <= 0) { System.out.println("缺货"); try { condition.await(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.println(Thread.currentThread().getName() + ":" + --product); condition.signalAll(); } finally { lock.unlock(); } }}// 生产者class ProductorLock implements Runnable { private ClerkLock clerk; public ProductorLock(ClerkLock clerk) { super(); this.clerk = clerk; } @Override public void run() { // TODO Auto-generated method stub for (int i = 0; i < 20; i++) { try { Thread.sleep(200); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } clerk.get(); } }}// 消费者class ConsumerLock implements Runnable { private ClerkLock clerk; public ConsumerLock(ClerkLock clerk) { super(); this.clerk = clerk; } @Override public void run() { // TODO Auto-generated method stub for (int i = 0; i < 20; i++) { clerk.sale(); } }}
阅读全文
0 0
- Java生产者和消费者案例
- java生产者和消费者案例
- java中生产者和消费者应用案例
- java多线程之生产者和消费者案例
- 生产者和消费者案例
- 多线程案例:生产者和消费者
- Java多线程操作案例-生产者和消费者实现
- 关于Java多线程------(4,经典案例---生产者和消费者)
- java多线程之生产者和消费者经典问题案例
- java 生产者和消费者
- Java 生产者和消费者
- Java生产者和消费者
- Java多线程经典案例-生产者消费者
- Java复习之生产者消费者案例
- java多线程之生产者与消费者案例
- 生产者 和 消费者 一个 小案例
- 线程经典案例---(生产者和消费者)
- Java 实现生产者和消费者
- 理解Spark的核心RDD
- PCB设计中的PTH孔(电镀通孔),NPTH(非电镀通孔)和vias的概念与区别
- 《架构即未来》中最常用的15个架构原则
- DM368开发 -- 你需要了解的知识点
- 十分钟教程,eclipse配置maven + 创建maven项目(三)
- java生产者和消费者案例
- json的转化
- 几行代码搭建nodejs代理服务器,从而解决跨域问题~!
- JavaScript学习总结——Object类详解
- SERVLETJSP Unit06: 状态管理-cookie
- Test
- sizeof与strlen的区别
- IIS部署WEBSERVICE,提示HTTP 错误 500.21
- 有关List<Map<String, Object>>解析