Account类

package com.thread.communication.condition;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; public class Account2 {
private final Lock lock = new ReentrantLock();
private final Condition conddraw = lock.newCondition();
private final Condition conddeposit = lock.newCondition(); private String accountNo;
private double balance; private boolean flag = false; public Account2(){} public Account2(String accountNo , double balance){
this.accountNo=accountNo;
this.balance=balance;
} public void setAccountNo(String num){
this.accountNo=num;
} public String getAccountNo(){
return this.accountNo;
} public double getBalance(){
return this.balance; } public void draw(double drawAmount){
System.out.println("drawtest");
lock.lock();
try{
System.out.println("开始取钱");
if(!flag){
System.out.println(Thread.currentThread().getName() + "被阻塞 ");
conddraw.await();
//conddraw.await(1000,TimeUnit.MILLISECONDS);
}else{
System.out.println(Thread.currentThread().getName() + "取钱: " + drawAmount);
this.balance-=drawAmount;
System.out.println("当前余额是: "+ balance);
flag = false;
conddeposit.signalAll();
System.out.println("通知存钱者 ");
}
}catch(InterruptedException ex){
ex.printStackTrace();
}finally{
lock.unlock();
} } public void deposit(double depositAmount){
System.out.println("deposittest");
lock.lock();
try{
System.out.println("开始存钱");
if(flag){
System.out.println(Thread.currentThread().getName() + "被阻塞 ");
conddeposit.await();
//conddeposit.await(1000,TimeUnit.MILLISECONDS);
}else{
System.out.println(Thread.currentThread().getName() + "存钱: " + depositAmount);
this.balance+=depositAmount;
System.out.println("当前余额是: "+ balance);
flag = true;
conddraw.signalAll();
System.out.println("通知取钱者 ");
}
}catch(InterruptedException ex){
ex.printStackTrace();
}finally{
lock.unlock();
}
} public int hashCode(){
return accountNo.hashCode();
} public boolean equals(Object obj){
if(this == obj)
return true;
if(obj !=null
&& obj.getClass()==Account2.class){
Account2 target =(Account2)obj;
return target.getAccountNo().equals(accountNo);
}
return false;
} }

两个线程

package com.thread.communication.condition;

public class DepositThread2 extends Thread{

    private Account2 account2;
private double depositAmount;
private String name; public DepositThread2(String name,Account2 account2,double depositAmount){
super(name);
this.name=name;
this.account2=account2;
this.depositAmount=depositAmount;
} public void run(){
for (int i=0;i<30;i++){
System.out.println(name + "第"+i+"次存钱");
account2.deposit(depositAmount);
}
}
}
package com.thread.communication.condition;

public class DrawThread2 extends Thread{
private Account2 account2;
private double drawAmount;
private String name; public DrawThread2(String name,Account2 account2,double drawAmount){
super(name);
this.name=name;
this.account2=account2;
this.drawAmount=drawAmount;
} public void run(){
for (int i=0;i<30;i++){
System.out.println(name+"第"+i+"次取钱");
account2.draw(drawAmount);
}
}
}

测试类

package com.thread.communication.condition;

public class DrawTest2 {

    public static void main(String[] args) {
Account2 acct = new Account2("account2",0.0);
System.out.println(acct.getAccountNo() + " " + acct.getBalance());
new DepositThread2("存钱者甲",acct,800.0).start();
new DepositThread2("存钱者已",acct,800.0).start();
new DepositThread2("存钱者丙",acct,800.0).start();
new DrawThread2("取钱者",acct,800.0).start();
} }

运行结果

account2 0.0
存钱者甲第0次存钱
存钱者已第0次存钱
deposittest
deposittest
开始存钱
存钱者丙第0次存钱
deposittest
取钱者第0次取钱
drawtest
存钱者已存钱: 800.0
当前余额是: 800.0
通知取钱者
。。。
deposittest
开始存钱
存钱者甲存钱: 800.0
当前余额是: 800.0
通知取钱者
存钱者丙第15次存钱
deposittest
开始存钱
存钱者丙被阻塞
存钱者已第18次存钱
deposittest
开始存钱
存钱者已被阻塞

线程通讯-Condition的更多相关文章

  1. java多线程(五)线程通讯

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

  2. Java线程通讯方法之wait()、nofity() 详解

    Java线程通讯方法之wait().nofity() 详解 本文将探讨以下问题: synchronized 代码块使用 notify()与notifyAll()的区别 Java wait(),noti ...

  3. Android 线程通讯类Handler

    handler是线程通讯工具类.用于传递消息.它有两个队列: 1.消息队列 2.线程队列 消息队列使用sendMessage和HandleMessage的组合来发送和处理消息. 线程队列类似一段代码, ...

  4. java多线程(2)---生命周期、线程通讯

    java生命周期.线程通讯 一.生命周期 有关线程生命周期就要看下面这张图,围绕这张图讲解它的方法的含义,和不同方法间的区别.    1.yield()方法 yield()让当前正在运行的线程回到就绪 ...

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

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

  6. Android——线程通讯类Handler(转)

    原文地址:http://uule.iteye.com/blog/1705951 handler是线程通讯工具类.用于传递消息.它有两个队列:1.消息队列2.线程队列 消息队列使用sendMessage ...

  7. 线程同步(使用了synchronized)和线程通讯(使用了wait,notify)

    线程同步 什么是线程同步? 当使用多个线程来访问同一个数据时,非常容易出现线程安全问题(比如多个线程都在操作同一数据导致数据不一致),所以我们用同步机制来解决这些问题. 实现同步机制有两个方法:1.同 ...

  8. iOS-多线程--介绍NSThread和GCD及其它们的线程通讯示例

    前言:下面就不一一列出 pthread.NSThread.GCD.NSOperation 的完整的各种方法了,只分别将最常用的列出来,以便偶尔瞄一眼. 一.NSThread 1> 线程间的通讯/ ...

  9. OC 线程操作 - GCD使用 -线程通讯, 延迟函数和一次性代码

    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ // [self downImag ...

随机推荐

  1. .Net Core表单验证

    验证 attributes: Attributes Input Type [EmailAddress] type=”email” [Url] type=”url” [HiddenInput] type ...

  2. PS 魔法棒

    魔术棒工具是通过选取图像中颜色相近或大面积单色区域的像素来制作选区,魔术棒用于纯色背景中较多. 容差数值越大,选择出的选区就越大,容差越小,对颜色差别的要求也就越严格,选择出的选区也就越小 按住shi ...

  3. Java Web工作原理(转载)

    知识要点: 1.HTTP协议 2.web服务器的缺陷及其解决方案 3.对Servlet的认识 4.Servlet的主要任务 5.web容器对Servlet的支持包括的内容 HTTP协议---(Hype ...

  4. Jquery源码分析-整体结构

    最近在学习Jquery的最新的源码,Jquery-3.3.1版本.网上有很多对jquery解析的文章.但是我还是要自己去尝试着看一篇jquery的源码.本系列博客用来记录其中的过程,并同大家分享.本次 ...

  5. Spring MVC的映射请求

    一.SpringMVC常用注解 @Controller 声明Action组件 @Service    声明Service组件    @Service("myMovieLister" ...

  6. Win10升级.NET Framework 3.5或2.0遇到错误0x800f081f

    具体方法如下: 1.将WIN10安装光盘ISO文件加载到虚拟光驱中. 2.WIN键+R键一起按,输入CMD后回车. 3.在CMD的命令行窗口里输入: cd C:Windowssystem32 跳转到s ...

  7. 编译和使用bsdiff

    在android开发中,越到后面生成apk文件越来越大,每次用户更新都是全部下载更新,浪费时间和流量,如果能增量更新就不错了,使用bsdiff就是为了生成更新包 bsdiff下载地址:http://w ...

  8. 各种数据库(oracle、mysql、sqlserver等)在Spring中数据源的配置和JDBC驱动包----转

    在开发基于数据库的应用系统时,需要在项目中进行数据源的配置来为数据 库的操作取得数据库连接.配置不同数据库的数据源的方法大体上都是相同的,不同的只是不同数据库的JDBC驱动类和连接URL以及相应的数据 ...

  9. LightOJ1213 Fantasy of a Summation —— 快速幂

    题目链接:https://vjudge.net/problem/LightOJ-1213 1213 - Fantasy of a Summation    PDF (English) Statisti ...

  10. Codeforces Round #303 (Div. 2) D. Queue —— 贪心

    题目链接:http://codeforces.com/problemset/problem/545/D 题解: 问经过调整,最多能使多少个人满意. 首先是排序,然后策略是:如果这个人对等待时间满意,则 ...