JAVA取钱多线程实验_JAVA多线程----用--取钱问题2

在该示例代码中,TestAccount类是测试类,主要实现创建帐户Account类的对象,以及启动学生线程StudentThread和启动家长线程GenearchThread。在StudentThread线程中,执行的功能是每隔2秒中取一次钱,每次取50元。在GenearchThread线程中,执行的功能是每隔12秒存一次钱,每次存200。这样存款和取款之间不仅时间间隔存在差异,而且数量上也会出现交叉。而该示例中,最核心的代码是Account类的实现。

在Account类中,实现了同步控制功能,在该类中包含一个关键的属性money,该属性的作用是存储帐户金额。在介绍该类的实现前,首先介绍一下两个同步方法——wait和notify方法的使用,这两个方法都是Object类中的方法,也就是说每个类都包含这两个方法,换句话说,就是Java天生就支持同步处理。这两个方法都只能在synchronized修饰的方法或语句块内部采用被调用。其中wait方法的作用是使调用该方法的线程休眠,也就是使该线程退出CPU的等待队列,处于冬眠状态,不执行动作,也不占用CPU排队的时间,notify方法的作用是唤醒一个任意该对象的线程,该线程当前处于休眠状态,至于唤醒的具体是那个则不保证。在Account类中,被StudentThread调用的getMoney方法的功能是判断当前金额是否是0,如果是则使StudentThread线程处于休眠状态,如果金额不是0,则取出50元,同时唤醒使用该帐户对象的其它一个线程,而被GenearchThread线程调用的saveMoney方法的功能是判断当前是否不为0,如果是则使GenearchThread线程处于休眠状态,如果金额是0,则存入200元,同时唤醒使用该帐户对象的其它一个线程。

如果还是不清楚,那就结合前面的程序执行结果来解释一下程序执行的过程:在程序开始执行时,学生线程和家长线程都启动起来,所以输出“准备取钱”和“准备存钱”,然后学生线程按照该线程run方法的逻辑执行,先延迟2秒,然后调用帐户对象a中的getMoney方法,但是由于初始情况下帐户对象a中的money数值为0,所以学生线程就休眠了。在学生线程执行的同时,家长线程也按照该线程的run方法的逻辑执行,先延迟12秒,然后调用帐户对象a中的saveMoney方法,由于帐户a对象中的money为零,条件不成立,所以执行存入200元,同时唤醒线程,由于使用对象a的线程现在只有学生线程,所以学生线程被唤醒,开始执行逻辑,取出50元,然后唤醒线程,由于当前没有线程处于休眠状态,所以没有线程被唤醒。同时家长线程继续执行,先延迟12秒,这个时候学生线程执行了4次,耗时4X2秒=8秒,就取光了帐户中的钱,接着由于帐户为0则学生线程又休眠了,一直到家长线程延迟12秒结束以后,判断帐户为0,又存入了200元,程序继续执行下去。

在解决多线程问题是,互斥和同步都是解决问题的思路,如果需要形象的比较这两种方式的区别的话,就看一下下面的示例。一个比较忙的老总,桌子上有2部电话,在一部处于通话状态时,另一部响了,老总拿其这部电话说我在接电话,你等一下,而没有挂电话,这种处理的方式就是互斥。而如果老总拿其另一部电话说,我在接电话,等会我打给你,然后挂了电话,这种处理的方式就是同步。两者相比,互斥明显占用系统资源(浪费电话费,浪费别人的时间),而同步则是一种更加好的解决问题的思路。

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

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

相关文章

Spark1——介绍

1、Spark是什么 Spark是一个用来实现快速而通用的集群计算的平台。 2、Spark是一个大一统的软件栈 Spark项目包含多个紧密集成的组件。首先Spark的核心是一个对由很多计算任务组成的、运行在多个工作机器或者是一个计算集群上的应用进行调度、分发以及监控的计算引擎。 Spark的…

java按输入顺序输出_java 输入3个数a,b,c,按大小顺序输出的实例讲解

java 输入3个数a,b,c,按大小顺序输出的实例讲解题目:输入3个数a,b,c,按大小顺序输出。代码:import java.util.Scanner;public class lianxi34 {public static void main(String[] args) {Scanner s new Scanner(System.in);Syste…

Java 8中HotSpot选项的改进文档

Oracle的 Java 8 的HotSpot实现中引入的一些小但受欢迎的功能之一是在启动器的文档中添加了许多常见的HotSpot Java启动器 ( java )选项/标志。 过去,即使是对某些相当常见的HotSpot JVM选项也感兴趣的开发人员 ,不得不潜在地寻找…

sql server数据库课程设计分析

课题:能源管理收费系统 系统功能的基本要求: (1)用户基本信息的录入:包括用户的单位、部门、姓名、联系电话、住址 ; (2)用户水、电、气数据的录入(每个月的数据的录入&a…

Springboot 项目启动后执行某些自定义代码

Springboot 项目启动后执行某些自定义代码 Springboot给我们提供了两种“开机启动”某些方法的方式:ApplicationRunner和CommandLineRunner。这两种方法提供的目的是为了满足,在项目启动的时候立刻执行某些方法。我们可以通过实现ApplicationRunner和Com…

android java 实体类 object变量 保存_Android中Intent传递对象的两种方法Serializable,Parcelable...

Android中的传递有两个方法,一个是Serializable,另一个是Parcelable。Serializable是J2SE本身就支持的。而Parcelable是Android所特有的。二者的使用场景和区别:1)在使用内存的时候,Parcelable比Serializable性能高,所…

[BZOJ4537][Hnoi2016]最小公倍数 奇怪的分块+可撤销并查集

4537: [Hnoi2016]最小公倍数 Time Limit: 40 Sec Memory Limit: 512 MBSubmit: 1474 Solved: 521[Submit][Status][Discuss]Description 给定一张N个顶点M条边的无向图(顶点编号为1,2,…,n),每条边上带有权值。所有权值都可以分解成2^a*3^b的形式。现在有q个询问&…

全新资源素材站源码 功能齐备 界面干净整洁

源码介绍 简单安装说明: 1、整站程序上传后台 2、然后导入数据库文件到数据库, 3、修改conf里面的conf的数据库名字及密码 4、配置伪静态 规则: location ~* \.(htm)$ { rewrite "^(.*)/(.?).htm(.*?)$" $1/index.php?$2…

jBPM和Drools工作台中的用户和组管理

介绍 本文讨论了一项新功能,该功能允许使用集成在jBPM和Drools Workbenches中的直观友好的用户界面来管理应用程序的用户和组。 用户和组管理 在安装,设置和使用此功能之前,本文讨论了一些以前的概念,需要进一步理解才能进一步使…

java懒加载设计模式_java设计模式——单例模式

整理一下设计模式的个人理解。描述单例模式是java中比较常见的一种设计模式,顾名思义为一个类只能创建一个实例,多用于全局对象,如:配置的加载,spring bean加载各种配置(spring容器所有bean默认都是单例)单例的特点为构…

BZOJ.4553.[HEOI2016TJOI2016]序列(DP 树状数组套线段树/二维线段树(MLE) 动态开点)

题目链接&#xff1a;BZOJ 洛谷\(O(n^2)\)DP很好写&#xff0c;对于当前的i从之前满足条件的j中选一个最大值,\(dp[i]d[j]1\) for(int j1; j<i; j)if(a[j]<minv[i]&&maxv[j]<a[i])//序列只会变换一次 dp[i]max{dp[j]1}; 转移要满足两个条件&#xff1a;\(a[j]…

java 快速构建ssm项目_SSM快速搭建

基本环境搭建1、 创建Maven工程2、 导入项目相关依赖的jar包springspringmvcmybatismysqljunitspring-testlombokdevtoolsxmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org…

jpa 查询 列表_终极JPA查询和技巧列表–第2部分

jpa 查询 列表这一部分是该系列文章的第一部分 。 JPA&#xff1a;NamedQuery&#xff0c;使用日期查询&#xff0c;有关getSingleResult方法的警告 为了避免重复查询代码&#xff0c;提高性能并简化维护查询&#xff0c;我们可以使用NamedQueries。 NamedQuery使用JPQL作为语…

IE针对Ajax请求结果的缓存IE浏览器同一个请求第二次是缓存数据不刷新

IE针对Ajax请求结果的缓存IE浏览器同一个请求第二次是缓存数据不刷新 IE针对Ajax请求结果的缓存/ IE浏览器同一个请求第二次是缓存 一.在AJAX请求的属性上直接设置cache function getSetServer (selectIDs) {$.ajax({url:/kl_eas/v1/monitor/servers? new Date().toTimeString…

亿联本科java_厦门亿联2018面试题

一、选择器public class EqTest {public static void main(String[] args) {EqTest e new EqTest();}public EqTest() {String s "Java";String s2 "java";//if (s.equalsIgnoreCase(s2)){System.out.println("相等");} else {System.out.pri…

如何将云持久存储添加到JBoss Cool Store

我们一直在讨论为什么应用程序开发人员在App Dev Cloud Stack系列中不能再忽略其堆栈了。 带有JBoss Cool Store的App Dev Cloud 上个月&#xff0c;我们提供了一个完整的零售示例&#xff0c;其中的JBoss Cool Store运行在您的堆栈的OpenShift Enterprise层上&#xff0c;由…

吴莫烦

https://morvanzhou.github.io/tutorials/machine-learning/ML-intro/2-1-NN/转载于:https://www.cnblogs.com/lhuser/p/8446525.html

mysql 表单属性_php表单常用属性有什么?

程序开发中&#xff0c;必不可少的会使用到form表单&#xff0c;以前只是在前端开发时简单使用&#xff0c;对它的属性不甚了解&#xff0c;最近在后端学习中&#xff0c;不断接触到它的属性,现记录一二。下面本篇文章给大家介绍php表单常用的5个属性。actionaction规定了提交表…

centos-安装python3.6环境并配置虚拟环境

python3.6下载地址&#xff1a;https://www.python.org/ftp/python/3.6.4/Python-3.6.4.tgz linux下python环境配置 统一目录&#xff1a; 源码存放位置 $HOME/tools安装目录&#xff1a; /application安装python环境&#xff1a; 1. 下载 # 创建下载目录 mkdir $HOME/tools #…

java构造器详解_Java中关于构造器的使用详解

这篇文章主要介绍了Java构造器使用方法及注意事项的相关资料,这里举例说明如何使用构造器及需要注意的地方&#xff0c;需要的朋友可以参考下Java构造器使用方法及注意事项超类的构造器在子类的构造器运行之前运行&#xff0c;也就是说&#xff0c;在创建对象时&#xff0c;先运…