通过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. 关于PHP的 PHP-FPM进程CPU 100%的一些原因分析和解决方案
  2. java oracle 图片_JAVA读取Oracle中的blob图片字段并显示
  3. 太突然!多所高校永久关闭
  4. 推特惊爆史诗级漏洞,App 恶意窃取用户隐私,云端安全路向何方?
  5. 【原创】CLEVO P157SM外接鼠标键盘失灵解决:更换硅脂(附带最新跑分数据)
  6. Object-C,四则运算计算器
  7. kindeditor编辑器 编辑器textarea不能获取到内容的解决办法
  8. Spark实例项目—每个域名下访问次数最多的URL
  9. xEasyApp之后端的介绍
  10. Linux之iNodeclient客户端定制和安装
  11. 选择题高分通过系统集成项目管理工程师
  12. Unity3D点击按钮改变材质球颜色
  13. python web游戏实例_Python实现小黑屋游戏的完整实例
  14. iphone 蓝牙开发 总结
  15. 电脑c盘数据迁移的方法
  16. 2021最新的高通骁龙处理器排名
  17. 【听】红高粱,莫言经典诺贝尔文学奖小说
  18. 利用HTML5新特性实现拖拽交换表格单元格元素
  19. 10.数据中台 --- 数据中台运营机制
  20. 如何配置一台以机器学习、深度学习为用途的工作站?

热门文章

  1. 机器学习:金融领域的岗位需求
  2. 供应商太多,怎么才能高效比价?
  3. halcon real类型深度图转灰度图、转点云图、拟合平面和测量高度
  4. 多个excel工作簿合并_Excel多工作簿合并,只需一个简单的公式搞定
  5. excel工作簿合并怎么处理?
  6. mac怎么无线打印机连接到服务器,Mac电脑怎么连接打印机
  7. 如何将PPT进行压缩?PPT压缩的方法是什么
  8. Ceph Cache tier配置
  9. u盘安全弹出有什么用?数据丢失还能恢复吗
  10. 项目启动时就执行某些操作、@Scheduled定时项目启动时执行一次