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. kubernetes资源调度之LimitRange

    系列目录 LimitRange从字面意义上来看就是对范围进行限制,实际上是对cpu和内存资源使用范围的限制 前面我们讲到过资源配额,资源配额是对整个名称空间的资源的总限制,是从整体上来限制的,而Lim ...

  2. mysql 中创建递归函数

    1.在navicat中创建递归函数 BEGIN ) DEFAULT ''; ) default ''; ) default ''; ) default rootId; ; WHILE rootId i ...

  3. Java的泛型约束和限制

    不能用基本类型实例化类型参数 不能用类型参数代替基本类型:例如,没有Pair<double>,只有Pair<Double>,其原因是类型擦除.擦除之后,Pair类含有Objec ...

  4. MongoDB的一些操作技巧

    去年三月底入职上海的一家互联网公司,由于项目使用的是MongoDB数据库所以有机会接触了MongoDB.在项目的开发过程中使用系统原有的一些方法查询MongoDB感觉很费力,用起来也不爽,所以私下里就 ...

  5. 04 svn设置开机启动

    一:设置开机启动[dos命令] 格式: sc create 服务名称 binPath=空格"安装目录/svnserve.exe -r 版本库地址目录 --service" star ...

  6. 【BZOJ4811】[Ynoi2017]由乃的OJ 树链剖分+线段树

    [BZOJ4811][Ynoi2017]由乃的OJ Description 由乃正在做她的OJ.现在她在处理OJ上的用户排名问题.OJ上注册了n个用户,编号为1-",一开始他们按照编号排名. ...

  7. EasyHLS实现将IPCamera摄像机的RTSP流转成HLS(ts+m3u8)直播输出

    本文转自:http://www.cnblogs.com/babosa/p/6033039.html EasyHLS EasyHLS是EasyDarwin开源流媒体团队开发的一款HLS打包库,接口非常简 ...

  8. ORA-00257

    删除归档日志文件的方法: http://www.blogjava.net/kuuyee/archive/2013/05/15/399287.html 惜分飞大大的博客:http://www.xifen ...

  9. DuiLib笔记之设置文本字体

    设置文本字体要用到Font 它的常用属性如下 id 用于标识Font,类型:INT name 用于指定字体名称,类型:STRING size 用于指定字体大小,类型:INT bold 用于指定是否加粗 ...

  10. Latex强制图片位置

    经常使用选项[htbp]是浮动格式: 『h』当前位置.将图形放置在正文文本中给出该图形环境的地方. 假设本页所剩的页面不够.这一參数将不起作用. 『t』顶部.将图形放置在页面的顶部. 『b』底部.将图 ...