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. oracle sql 当初始化数据时避免重复主键

    一:当有主键序列自动增长时候(序列为:seq_cct_id) insert into cs_cost_type (CCT_ID, CCT_NAME, CCT_RATE, CCT_RATE_TYPE, ...

  2. OcelotAPI 简单使用—服务发现、流控

    我这人比较懒 直接上配置文件的图 其中serviceName是服务名称, LoadBalancer是负载均衡策略. 对于流控我为了做测试写的1s 限制5次请求. 剩下的看名字就OK了. 要使用服务发现 ...

  3. PHP debug_backtrace() 函数

    PHP Error 和 Logging 函数 实例 生成 PHP backtrace: <?php function a($txt) { b("Glenn"); } func ...

  4. iOS 后台返回json解析出现的null的解决办法

    在后台返回值为Null为空时,我们代码没有判断时,程序就会崩溃.当时一直很疑惑是为啥,后来发现是数据问题,由于服务器的数据库中有些字段为空,然后以Json形式返回给客户端时就会出现这样的数据.当我们通 ...

  5. unity3d从零開始(五):了解摄像机

    1.简单介绍         Unity的摄像机是用来将游戏世界呈现给玩家的,游戏场景中至少有一台摄像机.也能够有多台. 2.类型         Unity中支持两种类型的摄像机,各自是Perspe ...

  6. 2016/07/07 mymps(蚂蚁分类信息/地方门户系统)

    mymps(蚂蚁分类信息/地方门户系统)是一款基于php mysql的建站系统.为在各种服务器上架设分类信息以及地方门户网站提供完美的解决方案. mymps,整站生成静态,拥有世界一流的用户体验,卓越 ...

  7. EasyDarwin开源流媒体服务器内存管理优化

    -本文由EasyDarwin开源团队成员Fantasy贡献 前言 最近在linux上跑EasyDarwin发现一个很奇怪的问题,当有RTSPSession连接上来的时候,发现进程的虚拟内存映射一下就多 ...

  8. httpclient4 模拟访问网页 模拟登录 简单例子

    JAVA后台模拟登录一个网站,获得一定权限后进一步操作. 所用的工具: Apache HttpComponents client 4.3版本 以下为代码: import org.apache.http ...

  9. 九度OJ 1126:打印极值点下标 (基础题)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4613 解决:1646 题目描述: 在一个整数数组上,对于下标为i的整数,如果它大于所有它相邻的整数, 或者小于所有它相邻的整数,则称为该整 ...

  10. file descriptor 0 1 2 一切皆文件 stdout stderr stdin /dev/null 沉默是金 pipes

    $>emtry_or_create_a_file.f $ll>>append_a_file.f standard output input error $ls -l /usr/bin ...