线程通讯-Condition
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的更多相关文章
- java多线程(五)线程通讯
1.1. 为什么要线程通信 多个线程并发执行时,在默认情况下CPU是随机切换线程的,有时我们希望CPU按我们的规律执行线程,此时就需要线程之间协调通信. 1.2. 线程通讯方式 线程间通信常用方式如下 ...
- Java线程通讯方法之wait()、nofity() 详解
Java线程通讯方法之wait().nofity() 详解 本文将探讨以下问题: synchronized 代码块使用 notify()与notifyAll()的区别 Java wait(),noti ...
- Android 线程通讯类Handler
handler是线程通讯工具类.用于传递消息.它有两个队列: 1.消息队列 2.线程队列 消息队列使用sendMessage和HandleMessage的组合来发送和处理消息. 线程队列类似一段代码, ...
- java多线程(2)---生命周期、线程通讯
java生命周期.线程通讯 一.生命周期 有关线程生命周期就要看下面这张图,围绕这张图讲解它的方法的含义,和不同方法间的区别. 1.yield()方法 yield()让当前正在运行的线程回到就绪 ...
- Android——线程通讯 Handler、Looper、Message;
线程通讯问题 (主要用到了Handler类,Looper类和Message类以及MessageQueue) 在Android中主线程如何向子线程中发送消息的问题.让我们来想想,这其中的过程,无非就是创 ...
- Android——线程通讯类Handler(转)
原文地址:http://uule.iteye.com/blog/1705951 handler是线程通讯工具类.用于传递消息.它有两个队列:1.消息队列2.线程队列 消息队列使用sendMessage ...
- 线程同步(使用了synchronized)和线程通讯(使用了wait,notify)
线程同步 什么是线程同步? 当使用多个线程来访问同一个数据时,非常容易出现线程安全问题(比如多个线程都在操作同一数据导致数据不一致),所以我们用同步机制来解决这些问题. 实现同步机制有两个方法:1.同 ...
- iOS-多线程--介绍NSThread和GCD及其它们的线程通讯示例
前言:下面就不一一列出 pthread.NSThread.GCD.NSOperation 的完整的各种方法了,只分别将最常用的列出来,以便偶尔瞄一眼. 一.NSThread 1> 线程间的通讯/ ...
- OC 线程操作 - GCD使用 -线程通讯, 延迟函数和一次性代码
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ // [self downImag ...
随机推荐
- codeforces Looksery Cup 2015 H Degenerate Matrix
The determinant of a matrix 2 × 2 is defined as follows: A matrix is called degenerate if its determ ...
- EasyPusher RTSP直播之RTP数据包格式解析
-本篇由团队成员Fantasy供稿! RTP包头格式 码流总体结构 h264的功能分为两层,视频编码层(VCL)和网络提取层(NAL).H.264 的编码视频序列包括一系列的NAL 单元,每个NAL ...
- 九度OJ 1129:Skew数 (大数运算)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:734 解决:548 题目描述: 在 skew binary表示中, 第 k 位的值xk表示xk*(2k+1-1). 每个位上的可能数字是0 ...
- 淘宝客网站SEO及赚钱与揭密
- 编译性语言&解释性语言
计算机是不能理解高级语言.当然也就不能直接执行高级语言了.计算机仅仅能直接理解机器语言,所以不论什么语言,都必须将其翻译成机器语言.不论什么编程语言编写的程序归根究竟都是由底层机器的机器代码(01序列 ...
- openssl之BIO系列之20---缓冲(buffer)类型BIO
缓冲(buffer)类型BIO ---依据openssl doc\crypto\bio_f_buffer.pod翻译和自己的理解写成 (作者:DragonKing, Mail: wzhah@263.n ...
- Template Pattern
1.Template模式解决的问题:对于某一个业务逻辑在不同的对象中有不同的细节实现,但是逻辑的框架是相同的.将逻辑框架放在抽象基类中,并定义好细节的接口,子类中实现细节.Template模式利用多态 ...
- jquery之extend
jquery的extend方法的用法1. [代码][JavaScript]代码 01<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01// ...
- 矩阵管理——和visitor模式没有本质区别,都是为了避免资源重复
矩阵管理中的员工是双线汇报的模式.其上司有两个,一个是流程上司,一个是专业上司.流程上司负责你的日常考核,专业上司负责你的晋升和任免. 管理条件 相对于矩阵管理的矩阵式组织,适合于某些较为庞大的全球性 ...
- Careless Me
我在百度知道上提了一个问题: 如图我在menu.xml里试图加一个search的按钮,但我从网页上复制了图中第二个item里的代码,运行的时候,这个item却总是出现在overflow(下拉菜单)里面 ...