java同步通信方式_java多线程同步与通信示例(synchronized方式)
java多线程同步示例,来自《疯狂java讲义》。通过synchronized,wait(),notify(),notifyAll()实现多线程同步与通信。假设现在系统中有两个线程,这两个线程分别代表存钱者和取钱者---现在假设系统有一种特殊的要求,系统要求存款者和取钱者不断地重复存钱、取钱动作,而且要求每当存款着将钱存入指定账户后,取钱者就立即取出这笔钱。不允许存款者连续两次存钱,也不允许取钱者连续两次取钱。程序中,通过一个旗标flag标识,本次账户操作是不是存款操作,以便下次操作可以探测。可类比:http://www.oschina.net/code/snippet_820500_44795
1.[代码]Account账户类,有取钱(drawBalance)和存钱(deposit)两个同步方法
package com.sunchp;
public class Account {
private String accountNo;
private double balance;
private boolean flag = false;
public Account(String _accountNo, double _balance) {
this.accountNo = _accountNo;
this.balance = _balance;
}
public String getAccountNo() {
return accountNo;
}
public void setAccountNo(String accountNo) {
this.accountNo = accountNo;
}
public double getBalance() {
return balance;
}
public synchronized void drawBalance(double drawBalance) {
if (flag) {
if (balance > drawBalance) {
System.out.println(Thread.currentThread().getName() + "取钱成功,正在吐钞:" + drawBalance);
balance -= drawBalance;
flag = false;
this.notifyAll();
System.out.println(Thread.currentThread().getName() + "余额为:" + getBalance());
} else {
System.out.println(Thread.currentThread().getName() + "取钱失败,余额不足");
}
} else {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public synchronized void deposit(double depositBalance) {
if (flag) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
System.out.println(Thread.currentThread().getName() + " 存款:" + depositBalance);
this.balance += depositBalance;
flag = true;
this.notifyAll();
System.out.println(Thread.currentThread().getName() + "余额为:" + getBalance());
}
}
}
2.[代码]取钱线程类
package com.sunchp;
public class MyThread1 implements Runnable {
private Account account;
private double drawBalance;
public Account getAccount() {
return account;
}
public void setAccount(Account account) {
this.account = account;
}
public double getDrawBalance() {
return drawBalance;
}
public void setDrawBalance(double drawBalance) {
this.drawBalance = drawBalance;
}
@Override
public void run() {
for (int i = 0; i < 100; i++) {
account.drawBalance(drawBalance);
}
}
}
3.[代码]存钱线程类
package com.sunchp;
public class MyThread2 implements Runnable {
private Account account;
private double depositBalance;
public Account getAccount() {
return account;
}
public void setAccount(Account account) {
this.account = account;
}
public double getDepositBalance() {
return depositBalance;
}
public void setDepositBalance(double depositBalance) {
this.depositBalance = depositBalance;
}
@Override
public void run() {
for (int i = 0; i < 100; i++) {
account.deposit(depositBalance);
}
}
}
4.[代码]测试类,main方法
package com.sunchp;
public class Test {
public static void main(String[] args) throws Exception {
Account acc = new Account("001", 1000);
MyThread1 mt1 = new MyThread1();
mt1.setAccount(acc);
mt1.setDrawBalance(20);
Thread t1 = new Thread(mt1, "取钱者1");
Thread t2 = new Thread(mt1, "取钱者2");
MyThread2 mt2 = new MyThread2();
mt2.setAccount(acc);
mt2.setDepositBalance(20);
Thread t3 = new Thread(mt2, "存钱者1");
Thread t4 = new Thread(mt2, "存钱者2");
t1.start();
t2.start();
t3.start();
t4.start();
}
}
java同步通信方式_java多线程同步与通信示例(synchronized方式)相关推荐
- java 多线程同步问题_Java多线程同步问题:一个小Demo完全搞懂
版权声明:本文出自汪磊的博客,转载请务必注明出处. Java线程系列文章只是自己知识的总结梳理,都是最基础的玩意,已经掌握熟练的可以绕过. 一.一个简单的Demo引发的血案 关于线程同步问题我们从一个 ...
- java 同步锁_Java多线程:synchronized同步锁的使用和实现原理
作用和用法 在多线程对共享资源进行并发访问方面,JDK提供了synchronized关键字来进行线程同步,实现多线程并发访问的线程安全.synchronized的作用主要体现在三个方面:(1)确保线程 ...
- java synchronized块_Java多线程同步代码块Synchronized
Java多线程同步代码块Synchronized Java中的每个对象都有一个与之关联的内部锁(Intrinsic lock). 这种锁也称为监视器(Monitor), 这种内部锁是一种排他锁,可以保 ...
- java 管程通信_Java多线程07_线程通信之管程法与信号灯法
Java多线程07_线程通信之管程法与信号灯法 线程通信 的应用场景是 消费者/生产者问题: 解决线程通信的方法: wait()表示线程一直等待,直到接到通知(会释放锁) wait(long time ...
- java多线程同步异步_003JAVA多线程同步与异步方法
003JAVA多线程同步与异步方法 发布时间:2020-04-03 09:51:20 来源:51CTO 阅读:314 作者:zjy1002261870 package com.skcc.mthread ...
- java线程钥匙_Java多线程并发编程/锁的理解
一.前言 最近项目遇到多线程并发的情景(并发抢单&恢复库存并行),代码在正常情况下运行没有什么问题,在高并发压测下会出现:库存超发/总库存与sku库存对不上等各种问题. 在运用了 限流/加锁等 ...
- 线程同步锁 java_java多线程同步之重入锁,详细解析
上次已经为大家介绍过java多线程同步,Volatile详解的主要内容了.今天再来为大家介绍一些相关的内容,也就是java多线程同步之重入锁,一起来了解一下吧. 使用重入锁实现线程同步 在JavaSE ...
- java线程栅栏_Java 多线程基础 - CyclicBarrier
我的博客 转载请注明原创出处. 序 java.util.concurrent包里有几个能帮助人们管理相互合作的线程集的类,为多线程常见的应用场景预置了抽象好的类库.在遇到这些应用场景时应该直接重用合适 ...
- java线程池_Java多线程并发:线程基本方法+线程池原理+阻塞队列原理技术分享...
线程基本方法有哪些? 线程相关的基本方法有 wait,notify,notifyAll,sleep,join,yield 等. 线程等待(wait) 调用该方法的线程进入 WAITING 状态,只有等 ...
最新文章
- html链接伪类设置鼠标悬停,链接伪类可以控制超链接的样式吗?是怎样实现的?...
- Java虚拟机性能监控工具草览
- 你知道R中的赋值符号箭头(-)和等号(=)的区别吗?
- linux运行脚本文件python,Python脚本:Linux自动化执行Python脚本
- 一文整理IEEE问题汇总【IEEE PDF Checker】(更新中)
- codeforces Labyrinth
- 大型Lambda的C# 泊松累积分布
- HDU 5666 Segment 数论+大数
- 如何在 macOS 上禁用 Adob​​e 后台进程,保存 CPU、内存和网络活动?
- 用波尔理论推导里德伯公式
- python学习--max和reduce函数
- rgret白鹭 开发html游戏,白鹭推HTML5首款生态产品Egret Runtime
- 初学单片机:Proteus 8 和 keil 4的使用方法(Proteus 8 和 keil 4建立一个项目/文件)
- 事务的隔离级别(附Redis的简述)
- java:计算自由落体运动中物体的位移
- 如何正确运用过去完成时
- c:\Windows\system32\ regsvr32.exe Windows无法访问指定设备、路径或文件,你可能没有适当的权限访问该项目
- layui ajax初始化,layui-滑块验证的动态修改及初始化
- docker 在线安装
- [SIM]MT6572在研发过程中,突然不识别SIM2