通过wait,notify等实现线程通讯

package org.thread.demo.threadcommunication;
/*** 银行账号类** */
public class Account {//账号private String account;//密码private String password;//余额private volatile  double amount;//定义标识 是不是有钱private boolean flag = true;/*** 取钱* */public synchronized  void suspend(double money) {try {Thread.sleep(1000);if(flag) {if(this.getAmount()>=money) {this.setAmount(this.getAmount() - money);System.out.println(Thread.currentThread().getName()+"取款成功");if(this.getAmount()<=0) {this.flag = false;}}else {System.out.println(Thread.currentThread().getName()+"余额不足,取款失败");//通知其他线程打钱  小头爸爸  二叔  王叔this.notifyAll();//自己的线程进行等待this.wait();}}else {//通知其他线程打钱  小头爸爸  二叔  王叔this.notifyAll();//自己的线程进行等待this.wait();}} catch (Exception e) {e.printStackTrace();}}/*** 存钱* */public synchronized  void susume(double money) {try {Thread.sleep(1000);if(flag) {//卡里有钱小明取钱this.notifyAll();//自己等待this.wait();}else {//卡里没钱 存款this.setAmount(money+this.getAmount());flag=true;System.out.println(Thread.currentThread().getName()+"存款成功");this.notifyAll();//自己等待this.wait();}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}public String getAccount() {return account;}public void setAccount(String account) {this.account = account;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public double getAmount() {return amount;}public void setAmount(double amount) {this.amount = amount;}@Overridepublic String toString() {return "Account [account=" + account + ", password=" + password + ", amount=" + amount + "]";}
}
package org.thread.demo.threadcommunication;
/*** 线程通讯* 当卡了余额不足时候,通知其他线程存钱* 当线程存款完成后,通知其他线程去取现* wait  notify线程通讯* */
public class Test {public static void main(String[] args) {//创建账户Account account = new Account();account.setAccount("1");account.setPassword("1");account.setAmount(10000);//模拟三个线程 一个取钱 三个存钱SuspendThread suspendThread = new SuspendThread(account,10000);suspendThread.setName("大头儿子");suspendThread.start();SusumeThread susumeThread0 = new SusumeThread(account,10000);susumeThread0.setName("小头爸爸");SusumeThread susumeThread1 = new SusumeThread(account,10000);susumeThread1.setName("二叔");SusumeThread susumeThread2 = new SusumeThread(account,10000);susumeThread2.setName("老王");susumeThread1.start();susumeThread0.start();susumeThread2.start();}
}
package org.thread.demo.threadcommunication;
/**** 取现*/
public class SuspendThread  extends Thread{///定义成员变量,同步到内存中private Account account;private double money;public SuspendThread(Account account,double money) {this.account = account;this.money = money;}//不断的取钱@Overridepublic void run() {while(true) {account.suspend(money);}}
}
package org.thread.demo.threadcommunication;
/*** 存钱* */
public class SusumeThread  extends Thread{///定义成员变量,同步到内存中private Account account;private double money;public SusumeThread(Account account,double money) {this.account = account;this.money = money;}//不断的存钱@Overridepublic void run() {while(true) {account.susume(money);;}}
}

通过wait,notify等实现线程通讯相关推荐

  1. 线程通讯(wait方法、notify方法、notifyAll方法)

    目录 1. 方法介绍 2. wait使用 3. notify使用 4. notifyAll使用 5. 注意事项 由于线程之间是抢占式执⾏的, 因此线程之间执⾏的先后顺序难以预知. 但是实际开发中有时候 ...

  2. java 线程通讯_java多线程(五)线程通讯

    1.1. 为什么要线程通信 多个线程并发执行时,在默认情况下CPU是随机切换线程的,有时我们希望CPU按我们的规律执行线程,此时就需要线程之间协调通信. 1.2. 线程通讯方式 线程间通信常用方式如下 ...

  3. 14.4 线程通讯-生产者与消费者

    package cn.chen.threadcommunication; /* 线程通讯:一个线程完成了自己的任务时,要通知另外一个线程去完成另一个任务.生产者与消费者wait(); 等待如果线程执行 ...

  4. java线程通讯的方式

    java线程通讯的方式主要有三种 suspend/resume wait/notify park/unpark suspend/resume 正常的suspend/resume public void ...

  5. 关于Java线程通讯的学习日志

    Java中线程通讯 主要涉及对并发线程的操控 1.利用synchronized进行对象锁定实现对线程的控制 2.使用lock condition进行线程控制 3.使用管道(Piped)Stream 为 ...

  6. Android——线程通讯 Handler、Looper、Message;

    线程通讯问题 (主要用到了Handler类,Looper类和Message类以及MessageQueue) 在Android中主线程如何向子线程中发送消息的问题.让我们来想想,这其中的过程,无非就是创 ...

  7. WxPython 界面利用pubsub与线程通讯

    WxPython 4.0 以后不用wx.lib.pubsub 来做消息通讯了, 改用 pubsub , 如果继续用 wx.lib.pubsub , 会有以下警告提示: >>> fro ...

  8. 吉林大学操作系统上机(实验一:Linux进程与线程通讯)

    前言 我希望找到这里的学弟学妹能基于我的内容完成的更好,这里的代码和思路应该是你们的下限!! 我分享这些笔记的初衷是因为我觉得csdn上与之相关的不少博客都收费,但是我当时做的时候,我觉得就那么一点东 ...

  9. java线程没wait前调用notify,深入Java线程 之 wait和notify

    wait和notify 多线程是需要同步协作,比如QuartzSchedulerThread,作为Quartz的任务调度线程,如果设置该线程暂停,那么这个线程就必须wait, 等外界通知继续的时候,再 ...

  10. java通讯方式_Java线程通讯方式 - osc_63rgy8af的个人空间 - OSCHINA - 中文开源技术交流社区...

    l  休眠唤醒方式: Object的wait.notify.notifyAll Condition的await.signal.signalAll l  CountDownLatch:用于某个线程A等待 ...

最新文章

  1. 【机器学习知识体系】- 机器学习问题的一般流程
  2. (周星驰版)学习委托的最好实例 (转载+自己补充了注释)
  3. 一周一论文(翻译 总结)—— [DSN 18] RDMC A Reliable RDMA Multicast for Large Objects :一个面向大型对象的可靠的RDMA广播框架
  4. Tomcat虚拟主机搭建Web站点
  5. python中cgi到底是什么_十分钟搞懂什么是CGI(转)
  6. Linux命令(11)—— 给文件增加和减少权限chomod命令
  7. SQL2005的配置
  8. RocketMQ核心架构设计思想
  9. 优先队列/oriority queue 之最大优先队列的实现
  10. python: 动态网页playwright 爬虫实践
  11. C语言实现万年历记事本,简单实用的layui日历标注记事本代码
  12. 电容与电感串联直流电路系统分析
  13. 项目踩坑随记 —— getTime() is not a function
  14. edp接口规范_EDP接口是什么接口?EDP是什么的缩写?
  15. 微型计算机中的位置的是什么,电脑基础知识问答卷
  16. 阿里云服务器可以更ip吗?
  17. unity实战 手机屏幕适配
  18. linux 1000权限不够,LINUX常见问题1000个详细解答
  19. 通过串口号获得该串口号对应的设备信息(如设备范例ID等)
  20. 《空气动力学基础》——第三章 无黏不可压缩流动基础

热门文章

  1. git push时报错: hook declined to update refs/heads/detail-header
  2. C语言闰年还是平年问题程序,c语言判断一年是不是闰年,编程错在哪呢?
  3. Deecamp20 项目提交【如何用pcdet(second)跑自己的数据】
  4. python实现fastq文件GC含量的计算
  5. TTL转HDMI,首选LT8618SXB,提供技术支持
  6. 在线裁剪图片 Jcrop
  7. 计算机办公软件基础知识题库,办公软件基础知识试题试卷--题库.doc
  8. SpringMVC框架原理图
  9. MIPI.DSI.LCD點屏筆記_AT070TN92(800x480)_THC63LVDF84B_深圳富元智FX6
  10. 腾讯云CDN加速COS图床