import java.util.concurrent.locks.*;
class DuckMsg{int size;//烤鸭的大小String id;//烤鸭的厂家和标号
    DuckMsg(){}DuckMsg(int size, String id){this.size=size;this.id=id;}public String toString(){return id + " 大小为:"  + size;}
}
class Duck{private int count=0;//生产烤鸭的总数private int putId=0, takeId=0;//分别表示存入的Id 和 取出烤鸭的Id
    Lock lock = new ReentrantLock();DuckMsg[] dk = new DuckMsg[100];//烤鸭的容器Condition conProduce = lock.newCondition();Condition conConsume = lock.newCondition();public void put(int sz){lock.lock();try{while(count==dk.length)//一直等到烤鸭全部生产完毕之后所有的生产线程都停止....
               conProduce.await();dk[putId++]=new DuckMsg(sz, Thread.currentThread().getName()+":"+(putId-1));if(putId==dk.length)  putId=0;//啥意思呢?烤鸭的编号就是1到100, 如果过了100,那么再从编号1开始!++count;conConsume.signal();}catch(InterruptedException e){}finally{lock.unlock();}        }public void get(){lock.lock();try{while(count==0)conConsume.await();System.out.println(dk[takeId++]);System.out.println("......." + Thread.currentThread().getName());//打印消费的厂家if(takeId==dk.length)  takeId=0;--count;conProduce.signal();}catch(InterruptedException e){}finally{lock.unlock();}}
}class Producer implements Runnable{Duck duck;Producer(Duck duck){this.duck=duck;}public void run(){for(int i=1; ; ++i)duck.put(i);}
}class Consumer implements Runnable{Duck duck;Consumer(Duck duck){this.duck=duck;}public void run(){while(true)duck.get();}
}public class ProduceConsumeDemo{public static void main(String[] args){Duck duck=new Duck();Thread t1 = new Thread(new Producer(duck), "生产厂家 1");Thread t2 = new Thread(new Producer(duck), "生产厂家 2");Thread t3 = new Thread(new Consumer(duck), "消费厂家 1");Thread t4 = new Thread(new Consumer(duck), "消费厂家 2");t1.start();t2.start();t3.start();t4.start();}
}

转载于:https://www.cnblogs.com/hujunzheng/p/3920876.html

java中多线程模拟(多生产,多消费,Lock实现同步锁,替代synchronized同步代码块)...相关推荐

  1. Java——使用多线程模拟真实高并发业务并保证安全性(一)

    作者专注于Java.架构.Linux.小程序.爬虫.自动化等技术. 工作期间含泪整理出一些资料,微信搜索[javaUp],回复 [java][黑客][爬虫][小程序][面试]等关键字免费获取资料.技术 ...

  2. Java中多线程的性能比较

    Java中有多种用于多线程的技术. 可以通过同步关键字,锁或原子变量来并行化Java中的一段代码. 这篇文章将比较使用synced关键字ReentrantLock,getAndIncrement()以 ...

  3. Java中多线程访问冲突的解决方式

    Java中多线程访问冲突的解决方式 当时用多线程访问同一个资源时,非常容易出现线程安全的问题,例如当多个线程同时对一个数据进行修改时,会导致某些线程对数据的修改丢失.因此需要采用同步机制来解决这种问题 ...

  4. java runnable 异常_详解Java中多线程异常捕获Runnable的实现

    详解Java中多线程异常捕获Runnable的实现 1.背景: Java 多线程异常不向主线程抛,自己处理,外部捕获不了异常.所以要实现主线程对子线程异常的捕获. 2.工具: 实现Runnable接口 ...

  5. (面经总结)一篇文章带你整理面试过程中关于Java 中多线程的创建方式的最全整理

    文章目录 一.Java线程的创建方式 二.继承Thread类 三.实现 Runnable 接口 四.通过ExecutorService和`Callable`实现有返回值的线程 五.基于线程池 六.面试 ...

  6. JAVA中多线程基础知识

    程序(软件):数据和指令的集合.软件架构:B/S  C/S  软件分类:系统软件,应用软件. 进程:正在运行的程序,会在内存中分配空间. 线程:进程中的多条路径. 多线程是指有多条线程并发的执行. 并 ...

  7. Java中多线程启动,为什么调用的是start方法,而不是run方法?

    前言 大年初二,大家新年快乐,我又开始码字了.写这篇文章,源于在家和基友交流的时候,基友问到了,我猛然发现还真是这么回事,多线程启动调用的都是start,那么为什么没人掉用run呢?于是打开我的ide ...

  8. Java 中如何模拟真正的同时并发请求?

    有时需要测试一下某个功能的并发性能,又不要想借助于其他工具,索性就自己的开发语言,来一个并发请求就最方便了. java中模拟并发请求,自然是很方便的,只要多开几个线程,发起请求就好了.但是,这种请求, ...

  9. java中多线程编程案例_Java中多线程编程实战的实现线程_Java编程_Java程序员_课课家...

    java编程语言使多线程如此简单有效,以致于某些程序员说它实际上是自然的.尽管在 Java 中使用线程比在其他语言中要容易得多,仍然有一些概念需要掌握.要记住的一件重要的事情是 main() 函数也是 ...

最新文章

  1. c语言如何判断数组不为空,PHP 判断数组是否为空的几种方法
  2. 以local模式使用Xshell+Xmanager远程监控jvisualvm
  3. 多master mysql_使用 Rotate Master 实现MySQL 多主复制
  4. Python删除文件及进行文件夹压缩
  5. RS485光纤中继器有哪些优缺点?
  6. H5 水球加载动画 - canvas应用篇
  7. Linux shell —— 数组与关联数组
  8. 韦根w34是多少位_韦根(Wiegand)数据传输格式
  9. C语言实现任何文件的加密解密
  10. 4011: [HNOI2015]落忆枫音
  11. k8s集群添加master节点
  12. ffmpeg 分割和合并
  13. win10未能解析服务器名,win10系统提示“无法解析服务器的dns地址”的修复方法...
  14. PHP,$this-{$xxx} 是什么意思?
  15. Linux误删文件或程序如何恢复
  16. eis系统 java_Java消息系统介绍 - marvin_vov的个人空间 - OSCHINA - 中文开源技术交流社区...
  17. OaisimWithS1搭建笔记(2019.5)
  18. 如何使用TeamViewer在局域网内远程连接另一台电脑
  19. H5页面动态文案使用艺术字体的解决方案
  20. 浅谈去哪儿算法,搜索结果打乱,_m_参数,headers,pre关键参数等

热门文章

  1. Mybatis Generator 配置详解
  2. RPC 中 参数传递 ImputStream 流会关闭
  3. MySQL架构与历史【v1】【励志把高性能MySQL吃掉】
  4. uniapp页面传参使用encodeURIComponent转义特殊符号
  5. 服务器上的文件怎么取名,给新的服务器取名你会取神马?
  6. mysql统计每周每个学校新增学生数量_深入学习之mysql(四)聚合函数
  7. java配置jndi连接数_JavaWeb:Tomcat下配置数据源(JNDI)连接数据库 | 学步园
  8. html5下拉列表多行显示不出来,为什么我这个代码的效果显示不出来?我要显示的是鼠标经过选项出现下拉菜单栏!求大神提点!!!...
  9. 星形和雪花模型_数据仓库多维数据模型设计
  10. 图片夹_各种变调夹的优缺点、原理和使用方法