java中多线程模拟(多生产,多消费,Lock实现同步锁,替代synchronized同步代码块)...
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同步代码块)...相关推荐
- Java——使用多线程模拟真实高并发业务并保证安全性(一)
作者专注于Java.架构.Linux.小程序.爬虫.自动化等技术. 工作期间含泪整理出一些资料,微信搜索[javaUp],回复 [java][黑客][爬虫][小程序][面试]等关键字免费获取资料.技术 ...
- Java中多线程的性能比较
Java中有多种用于多线程的技术. 可以通过同步关键字,锁或原子变量来并行化Java中的一段代码. 这篇文章将比较使用synced关键字ReentrantLock,getAndIncrement()以 ...
- Java中多线程访问冲突的解决方式
Java中多线程访问冲突的解决方式 当时用多线程访问同一个资源时,非常容易出现线程安全的问题,例如当多个线程同时对一个数据进行修改时,会导致某些线程对数据的修改丢失.因此需要采用同步机制来解决这种问题 ...
- java runnable 异常_详解Java中多线程异常捕获Runnable的实现
详解Java中多线程异常捕获Runnable的实现 1.背景: Java 多线程异常不向主线程抛,自己处理,外部捕获不了异常.所以要实现主线程对子线程异常的捕获. 2.工具: 实现Runnable接口 ...
- (面经总结)一篇文章带你整理面试过程中关于Java 中多线程的创建方式的最全整理
文章目录 一.Java线程的创建方式 二.继承Thread类 三.实现 Runnable 接口 四.通过ExecutorService和`Callable`实现有返回值的线程 五.基于线程池 六.面试 ...
- JAVA中多线程基础知识
程序(软件):数据和指令的集合.软件架构:B/S C/S 软件分类:系统软件,应用软件. 进程:正在运行的程序,会在内存中分配空间. 线程:进程中的多条路径. 多线程是指有多条线程并发的执行. 并 ...
- Java中多线程启动,为什么调用的是start方法,而不是run方法?
前言 大年初二,大家新年快乐,我又开始码字了.写这篇文章,源于在家和基友交流的时候,基友问到了,我猛然发现还真是这么回事,多线程启动调用的都是start,那么为什么没人掉用run呢?于是打开我的ide ...
- Java 中如何模拟真正的同时并发请求?
有时需要测试一下某个功能的并发性能,又不要想借助于其他工具,索性就自己的开发语言,来一个并发请求就最方便了. java中模拟并发请求,自然是很方便的,只要多开几个线程,发起请求就好了.但是,这种请求, ...
- java中多线程编程案例_Java中多线程编程实战的实现线程_Java编程_Java程序员_课课家...
java编程语言使多线程如此简单有效,以致于某些程序员说它实际上是自然的.尽管在 Java 中使用线程比在其他语言中要容易得多,仍然有一些概念需要掌握.要记住的一件重要的事情是 main() 函数也是 ...
最新文章
- c语言如何判断数组不为空,PHP 判断数组是否为空的几种方法
- 以local模式使用Xshell+Xmanager远程监控jvisualvm
- 多master mysql_使用 Rotate Master 实现MySQL 多主复制
- Python删除文件及进行文件夹压缩
- RS485光纤中继器有哪些优缺点?
- H5 水球加载动画 - canvas应用篇
- Linux shell —— 数组与关联数组
- 韦根w34是多少位_韦根(Wiegand)数据传输格式
- C语言实现任何文件的加密解密
- 4011: [HNOI2015]落忆枫音
- k8s集群添加master节点
- ffmpeg 分割和合并
- win10未能解析服务器名,win10系统提示“无法解析服务器的dns地址”的修复方法...
- PHP,$this-{$xxx} 是什么意思?
- Linux误删文件或程序如何恢复
- eis系统 java_Java消息系统介绍 - marvin_vov的个人空间 - OSCHINA - 中文开源技术交流社区...
- OaisimWithS1搭建笔记(2019.5)
- 如何使用TeamViewer在局域网内远程连接另一台电脑
- H5页面动态文案使用艺术字体的解决方案
- 浅谈去哪儿算法,搜索结果打乱,_m_参数,headers,pre关键参数等
热门文章
- Mybatis Generator 配置详解
- RPC 中 参数传递 ImputStream 流会关闭
- MySQL架构与历史【v1】【励志把高性能MySQL吃掉】
- uniapp页面传参使用encodeURIComponent转义特殊符号
- 服务器上的文件怎么取名,给新的服务器取名你会取神马?
- mysql统计每周每个学校新增学生数量_深入学习之mysql(四)聚合函数
- java配置jndi连接数_JavaWeb:Tomcat下配置数据源(JNDI)连接数据库 | 学步园
- html5下拉列表多行显示不出来,为什么我这个代码的效果显示不出来?我要显示的是鼠标经过选项出现下拉菜单栏!求大神提点!!!...
- 星形和雪花模型_数据仓库多维数据模型设计
- 图片夹_各种变调夹的优缺点、原理和使用方法