JAVA多线程互斥同步例子

package com.imooc.concurrent.racecondition;/*** 宇宙的能量系统* 遵循能量守恒定律:* 能量不会凭空创生或消失,只会从一处转移到另一处*/
public class EnergySystem {//能量盒子,能量存贮的地方private final double[] energyBoxes;private final Object lockObj = new Object();/*** * @param n    能量盒子的数量* @param initialEnergy 每个能量盒子初始含有的能量值*/public EnergySystem(int n, double initialEnergy){energyBoxes = new double[n];for (int i = 0; i < energyBoxes.length; i++)energyBoxes[i] = initialEnergy;}/*** 能量的转移,从一个盒子到另一个盒子* @param from 能量源* @param to     能量终点 * @param amount 能量值*/public void transfer(int from, int to, double amount){synchronized(lockObj){//			 if (energyBoxes[from] < amount)
//				 return;//while循环,保证条件不满足时任务都会被条件阻挡//而不是继续竞争CPU资源while (energyBoxes[from] < amount){try {//条件不满足, 将当前线程放入Wait SetlockObj.wait();} catch (InterruptedException e) {e.printStackTrace();}}System.out.print(Thread.currentThread().getName());energyBoxes[from] -= amount;System.out.printf("从%d转移%10.2f单位能量到%d", from, amount, to);energyBoxes[to] += amount;System.out.printf(" 能量总和:%10.2f%n", getTotalEnergies());//唤醒所有在lockObj对象上等待的线程lockObj.notifyAll();}}/*** 获取能量世界的能量总和 */public double getTotalEnergies(){double sum = 0;for (double amount : energyBoxes)sum += amount;return sum;}/*** 返回能量盒子的长度*/public  int getBoxAmount(){return energyBoxes.length;}}

package com.imooc.concurrent.racecondition;public class EnergyTransferTask implements Runnable{//共享的能量世界private EnergySystem energySystem;//能量转移的源能量盒子下标private int fromBox;//单次能量转移最大单元private double maxAmount;//最大休眠时间(毫秒)private int DELAY = 10;public EnergyTransferTask(EnergySystem energySystem, int from, double max){this.energySystem = energySystem;this.fromBox = from;this.maxAmount = max;}public void run() {try{while (true){int toBox = (int) (energySystem.getBoxAmount()* Math.random());double amount = maxAmount * Math.random();energySystem.transfer(fromBox, toBox, amount);Thread.sleep((int) (DELAY * Math.random()));}}catch (InterruptedException e){e.printStackTrace();}}}
package com.imooc.concurrent.racecondition;public class EnergySystemTest {//将要构建的能量世界中能量盒子数量public static final int BOX_AMOUNT = 100;//每个盒子初始能量public static final double INITIAL_ENERGY = 1000;public static void main(String[] args){EnergySystem eng = new EnergySystem(BOX_AMOUNT, INITIAL_ENERGY);for (int i = 0; i < BOX_AMOUNT; i++){EnergyTransferTask task = new EnergyTransferTask(eng, i, INITIAL_ENERGY);Thread t = new Thread(task,"TransferThread_"+i);t.start();}}}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/553774.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

导出为Excel例子 java

前台&#xff1a; //getExcelXML有一个JSON对象的配置&#xff0c;配置项看了下只有title配置&#xff0c;为excel文档的标题 var data $(#dg).datagrid(getExcelXml, { title: datagrid import to excel }); //获取datagrid数据对应的excel需要的xml格式的内容 //组装form提…

edge浏览器下载位置设置

edge浏览器下载位置设置 edge浏览器下载位置怎么设置?很多Win10用户要求微软为Edge浏览器增加下载位置设置选项&#xff0c;今天小编就为大家带来更改Win10 Edge浏览器默认下载位置的三种方法&#xff0c;可通过下面的方法来实现&#xff1a; 方法一&#xff1a; 可通过软媒…

java中静态代码块的用法 static用法详解

&#xff08;一&#xff09;java 静态代码块 静态方法区别 一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调用的时候,需要使用静态方法,这种代码是被动执行…

QQ浏览噐怎么拍照识题 QQ浏览器拍照识题教程介绍说明

QQ浏览噐在最近推出了拍照识题的服务&#xff0c;有不少感兴趣的用户想知道应该怎么使用该功能。那么下面小编就为大家介绍了QQ浏览器拍照识题的方法&#xff0c;希望对你有所帮助。 QQ浏览器拍照识题的步骤&#xff1a; 1、现在进入了QQ浏览噐页面后&#xff0c;要是想使用拍…

mysql中int、bigint、smallint 和 tinyint的区别与长度的含义

bigint 从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据&#xff08;所有数字&#xff09;。存储大小为 8 个字节。 P.S. bigint已经有长度了&#xff0c;在mysql建表中的length&#xff0c;只是用于显示的位数 int 从 -2^31 (-2,147,483,648) 到…

谷歌浏览器怎么禁用flash flash禁用方法分享

频频曝出的安全漏洞&#xff0c;让flash的存在感越来越低&#xff0c;甚至曾有一个Flash安全漏洞被曝可用于向Windows PC传播勒索软件&#xff0c;许多公司和个人用户也因此选择禁用flash!那么&#xff0c;在谷歌浏览器中要怎么禁用flash呢?下面就让我们来了解一下。 方法步骤…

阿里RocketMQ Quick Start

RocketMQ单机支持1万以上的持久化队列&#xff0c;前提是足够的内存、硬盘空间&#xff0c;过期数据数据删除&#xff08;RocketMQ中的消息队列长度不是无限的&#xff0c;只是足够大的内存数据定时删除&#xff09; RocketMQ版本&#xff1a;3.1.4 一&#xff0c;部署NameServ…

世界之窗浏览器怎么隐藏收藏栏

想必大家都知道&#xff0c;无论是什么浏览器&#xff0c;默认都是会显示收藏栏的&#xff0c;这样用户就可以快速打开收藏栏中收藏的网页&#xff0c;但很多时候有些用户会收藏一些不想被人看到的网页&#xff0c;这时候最好的方法就是将收藏栏隐藏起来了。那么&#xff0c;世…

Maven依赖排除 禁止依赖传递 取消依赖的方法

大家都知道Maven的优点是依赖管理&#xff0c;特别是前期使用ANT的开发者都有很多感触。最近要开发一个java工程&#xff0c;定的要使用maven&#xff0c;会使用hadoop和hbase的客户端&#xff0c;而引入一个hadoop-client的jar或者hbase的jar包&#xff0c;会依赖十几个其他的…

IE浏览器开发人员工具怎么使用

大家都知道IE是Windows系统默认的浏览器&#xff0c;功能齐全&#xff0c;方便用户操作&#xff0c;也为开发人员提供了许多便捷。为了帮助开发人员更好的调试浏览器&#xff0c;IE为大家准备了强大的开发人员工具&#xff0c;要怎么使用这个功能呢?下面小编来给大家讲讲。 操…

Intellij Idea的使用之svn篇

记一下idea的svn使用有图超详细 根据在eclipse里使用svn的经验琢磨了一下idea,现把idea下svn的使用方法记录如下 主要分为几个功能来介绍 第一个功能当然是把远程的svn代码拉到我们本地 下面的多出了一个svn的窗口&#xff0c;在左边有加号可以添加一个svn的库 输入svn的地…

爱奇艺PPS如何登陆账号

爱奇艺PPS是一个非常好的网络看电影的播放器。下面小编告诉大家如何登陆爱奇艺PPS&#xff0c;因为只有登陆才能获取特权 爱奇艺PPS如何登陆账号 1、首先打开爱奇艺PPS播放器 爱奇艺PPS如何登陆账号 2、点击左上角的爱奇艺这几个绿字 爱奇艺PPS如何登陆账号 3、点击弹出来…

Intellij IDEA 的使用

前言&#xff1a; 为什么我要选择intellij idea呢&#xff1f;原因有三 1.以前公司的项目 在myeclipse10中不稳定 myeclipse说不定什么时候就崩溃卡死了 而intellij很稳定 2.界面高端洋气 用我朋友的话说 看着跟搞苹果开发一样 3.项目的支持上比较好 基本上web项目都可以导…

笔记本win7系统关闭触摸板功能的方法

大家都知道win7笔记本电脑上有触摸面板&#xff0c;不过很多人都是只用鼠标的&#xff0c;而且触摸板还会影响操作&#xff0c;那么笔记本win7系统怎么关闭触摸板功能呢?下面一起来看看笔记本win7系统关闭触摸板功能的方法吧。 笔记本win7系统关闭触摸板功能的方法 1、打开电…

Eclipse设置、调优、使用

eclipse调优一般在不对eclipse进行相关设置的时候&#xff0c;使用eclipse总是会觉得启动好慢&#xff0c;用起来好卡&#xff0c;其实只要对eclipse的相关参数进行一些配置&#xff0c;就会有很大的改善。 加快启动速度1.在eclipse启动的时候&#xff0c;它总是会搜索让其运行…

怎么在pptv里下载电视剧

手机已越来越方便,尤其对爱看电视剧的我们,更方便了,想看什么可以一直看完,不用一天几集等的着急了,那用手机该怎么下载电视剧呢,让我们一起来学校下吧! 1、从主菜单上找到pptv,如果没有下载可以从安卓市场里直接下载个.下载好的就直接点击进入. 怎么在pptv里下载电视剧 2、…

Git上传代码到coding.net

coding.net是一个代码托管和项目管理的平台&#xff0c;相当于国外的Github。使用了一段时间&#xff0c;感觉挺方便的&#xff0c;使用起来比Github还要简单点。 git的下载和安装就且不介绍了&#xff0c;百度一下&#xff0c;windows、mac版的都能顺利的下载下来。下面简单介…

2345浏览器兼容模式怎么设置

2345浏览器兼容模式设置流程 1、打开浏览器&#xff0c;然后将鼠标放上去&#xff0c;就会显示浏览器的模式&#xff0c;用户可以点击地址旁边的图标&#xff0c;不是兼容模式就点击替换; 2、进入浏览器菜单&#xff0c;进入高级设置&#xff0c;选择自己想要的模式&#xff…

Guava 实用操作集合

guava 是 google 几个java核心类库的集合,包括集合、缓存、原生类型、并发、常用注解、基本字符串操作和I/O等等。 大家平时经常遇到某些相同的问题&#xff0c;自己写代码也都能解决。但是久而久之会感觉到很痛苦&#xff0c;因为我们一而再&#xff0c;再而三的重复发明轮子。…

QQ浏览器如何启用无痕模式

我们在日常浏览网页的时候总会留下浏览记录&#xff0c;同时会产生网页缓存&#xff0c;而别有用心之人就可以通过这些信息窥探到我们的隐私甚至威胁到我们的财产安全&#xff0c;而QQ浏览器为了防止产生浏览记录和网页缓存特地制作了无痕模式&#xff0c;那如何使用无痕模式呢…