为了实现这种功能,可以借助object对象提供的wait(),notify(),notifyall();这三个方法不属于thread类,而是属于object类,但是这三个方法必须由同步监视器来调用,对于用synchronized修饰的同步方法该类的默认就是this就是同步监视器,所以直接调用这三个方法,对于synchronized修饰的同步代码块,是括号里面的对象才是同步监视器,必须该对象才能调用.

package Mytread;
import java.math.BigDecimal;
public class Acount {
private String account_name;//账户编号
private double money_sum;//账户余额
private boolean flag;//标志账户是否有钱
private double draw_money;//要取多少钱
public Acount(){}
public Acount(String account_name,double money_sum){
this.account_name=account_name;
this.money_sum=money_sum;
}
//返回账户余额
public double get_money_Sum(){
return this.money_sum;
}
//取钱操作
public synchronized void draw(double draw_money){
try {
if(!flag){
this.wait();
}else{
System.out.println(this.money_sum);
System.out.println(Thread.currentThread().getName()+" 取钱:"+draw_money);
this.money_sum=this.money_sum-draw_money;
System.out.println(Thread.currentThread().getName()+"账户余额为:"+this.money_sum);
flag=false;
notifyAll();
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
//存钱
public synchronized void deposit(double deposit_money){
try{
if(flag){
wait();
}else{
System.out.println(Thread.currentThread().getName()+"存款为:"+deposit_money);
this.money_sum+=deposit_money;
System.out.println(Thread.currentThread().getName()+"总存款为:"+this.money_sum);
flag=true;
notifyAll();
}
}catch(Exception e){
System.out.println(e.getMessage());
}
}
}

package Mytread;
public class deposit_money extends Thread{
private Acount acount;
private double deposit_money;//存取的钱数
public deposit_money(String name,Acount acount,double deposit_money){
super(name);
this.acount=acount;
this.deposit_money=deposit_money;
}
public void run(){
for(int i=0;i<100;i++){
acount.deposit(deposit_money);
}
}
}

package Mytread;

import java.math.BigDecimal;
import java.util.concurrent.locks.ReentrantLock;
public class Draw_money extends Thread{
private Acount acount;//模拟用户
private double draw_money;//模拟取钱数目
public Draw_money(){}
public Draw_money(String name,Acount acount,double draw_money){
super(name);
this.acount=acount;
this.draw_money=draw_money;
}
public void run(){
for(int i=0;i<100;i++){
acount.draw(draw_money);
}
}

}

package Mytread;
public class Bank_Test {
public static void main(String[] args){
Acount acc=new Acount("1234567", 0);
new Draw_money("取钱着",acc, 800).start();
new deposit_money("存钱着1", acc, 800).start();
new deposit_money("存钱着2", acc, 800).start();
new deposit_money("存钱着3", acc, 800).start();
}

}

转载于:https://www.cnblogs.com/jianxin-lilang/p/6361477.html

Java复习-线程之间的通信与同步相关推荐

  1. Java多线程系列(二):线程的五大状态,以及线程之间的通信与协作

    在Java面试的时候,经常会问到Java并发编程相关的多线程.线程池.线程锁.线程通信等面试必考点,比如: Java并发编程系列:Java线程池的使用方式,核心运行原理.以及注意事项 Java并发编程 ...

  2. 7.生产者消费者 案例 (使用Lock 同步锁 方式,使用Condition完成线程之间的通信)...

    1 /* 2 * 生产者消费者 案例 (使用Lock 同步锁 方式,使用Condition完成线程之间的通信) 3 * */ 4 public class TestProductorAndConsum ...

  3. 黑马程序员--线程之间的通信,等待与唤醒机制,线程的终止方式,线程中的其他方法,优先级,toString() 守护线程,GUI图形化界面

    ------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS ...

  4. 多线程-线程之间的通信

    1.为什么需要线程通信 线程是操作系统调度的最小单位,有自己的栈空间,可以按照既定的代码逐步的执行,但是如果每个线程间都孤立的运行,那就会造资源浪费.所以在现实中,我们需要这些线程间可以按照指定的规则 ...

  5. Android笔记(三十一)Android中线程之间的通信(三)子线程给主线程发送消息...

    先看简单示例:点击按钮,2s之后,TextView改变内容. package cn.lixyz.handlertest;import android.app.Activity; import andr ...

  6. VC中利用多线程技术实现线程之间的通信

    当前流行的Windows操作系统能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力.用进程和线程的观点来研究软 ...

  7. QT小例子GUI(主)线程与子线程之间的通信

    QT小例子GUI(主)线程与子线程之间的通信 在主线程上,可以控制子线程启动,停止,清零 如果子线程启动的话,每一秒钟会向主线程发送一个数字,让主线程更新界面上的数字. #ifndef TQT_H_ ...

  8. SV学习笔记—线程之间的通信(事件event、信箱mailbox、旗语semaphore)

    目录 0.前言 1.事件event 2.信箱mailbox 3.旗语semaphore 0.前言 若多个线程之间想要进行数据交换或者知道彼此的状态以决定执行什么线程,SV中通过event.mailbo ...

  9. 黑马程序员————java线程之间的通信

    ------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS ...

最新文章

  1. QT:(4)解决在VS15下配置QT后没有QT GUI Application选项
  2. 可以连上网,能Ping通网关和DNS服务器,但是却不能访问网页
  3. 下载nodejs的mysql安装包下载_nodejs安装包下载|nodejs(javascript运行环境) v5.3.0 最新稳定版 - 软件下载 - 绿茶软件园|33LC.com...
  4. 小坑记录:get_cmap参数区分大小写
  5. 电大计算机统考模拟题在哪里学,[2017年电大]电大-计算机统考模拟题.doc
  6. oracle 删除时间段的,oracle SQL如何从日期中删除时间
  7. Redis—字符串和SDS
  8. 转子接地保护原理_发电机转子一点接地:保护原理、整定方法、动作后果
  9. Maven跳过antrun打包
  10. 什么是数据结构?对数据结构的理解
  11. 爬虫python漏洞群_python3-爬取cnnvd漏洞信息
  12. java ee 思维导图
  13. 线性规划——单纯形法
  14. js主要是用来向html页面中,javascript是用来干什么的?
  15. 【Java基础】Java开发环境搭建并编写第一个入门程序HelloWorld
  16. React中的ref属性的使用
  17. 为人“着想”和站在别人的角度--7-11创始人的经营理念引发的管理思考
  18. c 语言 用矩形法求定积分,如何用矩形法(梯形法)求定积分
  19. 薅羊毛常见问题合集——更新中
  20. LCD12864液晶显示模块的使用与分析

热门文章

  1. python利器怎么用-bluepy 一款python封装的BLE利器简单介绍
  2. python文字教程-Python 爬虫零基础教程(3):输出一个网页上的文字
  3. python爬虫吧-Python爬虫案例集合
  4. python实习做什么工作-面试python实习工作需要注意哪些事项???
  5. 关于python中程序流程结构-Python语言程序设计(第4章:程序结构设计)
  6. python类装饰器详解-Python 类装饰器解析
  7. python系统-python 系统相关操作
  8. 学python买什么电脑-程序员,买了台破Apple电脑,用来学Python
  9. python测试开发自学教程-自动化平台测试开发- Python 测试开发实战
  10. python简单代码画图-Python科学画图代码分享