通过wait,notify等实现线程通讯
通过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等实现线程通讯相关推荐
- 线程通讯(wait方法、notify方法、notifyAll方法)
目录 1. 方法介绍 2. wait使用 3. notify使用 4. notifyAll使用 5. 注意事项 由于线程之间是抢占式执⾏的, 因此线程之间执⾏的先后顺序难以预知. 但是实际开发中有时候 ...
- java 线程通讯_java多线程(五)线程通讯
1.1. 为什么要线程通信 多个线程并发执行时,在默认情况下CPU是随机切换线程的,有时我们希望CPU按我们的规律执行线程,此时就需要线程之间协调通信. 1.2. 线程通讯方式 线程间通信常用方式如下 ...
- 14.4 线程通讯-生产者与消费者
package cn.chen.threadcommunication; /* 线程通讯:一个线程完成了自己的任务时,要通知另外一个线程去完成另一个任务.生产者与消费者wait(); 等待如果线程执行 ...
- java线程通讯的方式
java线程通讯的方式主要有三种 suspend/resume wait/notify park/unpark suspend/resume 正常的suspend/resume public void ...
- 关于Java线程通讯的学习日志
Java中线程通讯 主要涉及对并发线程的操控 1.利用synchronized进行对象锁定实现对线程的控制 2.使用lock condition进行线程控制 3.使用管道(Piped)Stream 为 ...
- Android——线程通讯 Handler、Looper、Message;
线程通讯问题 (主要用到了Handler类,Looper类和Message类以及MessageQueue) 在Android中主线程如何向子线程中发送消息的问题.让我们来想想,这其中的过程,无非就是创 ...
- WxPython 界面利用pubsub与线程通讯
WxPython 4.0 以后不用wx.lib.pubsub 来做消息通讯了, 改用 pubsub , 如果继续用 wx.lib.pubsub , 会有以下警告提示: >>> fro ...
- 吉林大学操作系统上机(实验一:Linux进程与线程通讯)
前言 我希望找到这里的学弟学妹能基于我的内容完成的更好,这里的代码和思路应该是你们的下限!! 我分享这些笔记的初衷是因为我觉得csdn上与之相关的不少博客都收费,但是我当时做的时候,我觉得就那么一点东 ...
- java线程没wait前调用notify,深入Java线程 之 wait和notify
wait和notify 多线程是需要同步协作,比如QuartzSchedulerThread,作为Quartz的任务调度线程,如果设置该线程暂停,那么这个线程就必须wait, 等外界通知继续的时候,再 ...
- java通讯方式_Java线程通讯方式 - osc_63rgy8af的个人空间 - OSCHINA - 中文开源技术交流社区...
l 休眠唤醒方式: Object的wait.notify.notifyAll Condition的await.signal.signalAll l CountDownLatch:用于某个线程A等待 ...
最新文章
- 【机器学习知识体系】- 机器学习问题的一般流程
- (周星驰版)学习委托的最好实例 (转载+自己补充了注释)
- 一周一论文(翻译 总结)—— [DSN 18] RDMC A Reliable RDMA Multicast for Large Objects :一个面向大型对象的可靠的RDMA广播框架
- Tomcat虚拟主机搭建Web站点
- python中cgi到底是什么_十分钟搞懂什么是CGI(转)
- Linux命令(11)—— 给文件增加和减少权限chomod命令
- SQL2005的配置
- RocketMQ核心架构设计思想
- 优先队列/oriority queue 之最大优先队列的实现
- python: 动态网页playwright 爬虫实践
- C语言实现万年历记事本,简单实用的layui日历标注记事本代码
- 电容与电感串联直流电路系统分析
- 项目踩坑随记 —— getTime() is not a function
- edp接口规范_EDP接口是什么接口?EDP是什么的缩写?
- 微型计算机中的位置的是什么,电脑基础知识问答卷
- 阿里云服务器可以更ip吗?
- unity实战 手机屏幕适配
- linux 1000权限不够,LINUX常见问题1000个详细解答
- 通过串口号获得该串口号对应的设备信息(如设备范例ID等)
- 《空气动力学基础》——第三章 无黏不可压缩流动基础
热门文章
- git push时报错: hook declined to update refs/heads/detail-header
- C语言闰年还是平年问题程序,c语言判断一年是不是闰年,编程错在哪呢?
- Deecamp20 项目提交【如何用pcdet(second)跑自己的数据】
- python实现fastq文件GC含量的计算
- TTL转HDMI,首选LT8618SXB,提供技术支持
- 在线裁剪图片 Jcrop
- 计算机办公软件基础知识题库,办公软件基础知识试题试卷--题库.doc
- SpringMVC框架原理图
- MIPI.DSI.LCD點屏筆記_AT070TN92(800x480)_THC63LVDF84B_深圳富元智FX6
- 腾讯云CDN加速COS图床