线程通讯-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 ...
随机推荐
- Java8新特性(一)概览
最近看了好几段Java代码和以往的风格很不一样,都有点不太适应了,后来一查原来是Java8的新特性. 为了保持对技术的敏感性(面试...),这里我们一起来学习下Java8的新特性. 如果从技术角度来看 ...
- Finder 快捷键
记录几个常用的 Finder 快捷键: 复制 Finder 里选中的路径:option+cmd+c 地址栏跳到指定路径:shift+cmd+g 增加标签:cmd+t 显示/隐藏 标签栏:shift+c ...
- 使用C#解决部分Win8.1系统窗体每隔几秒失去焦点的问题
使用了Win8.1 With Update 1后,发现重新启动系统后,当前激活的窗体总是每隔几秒失去焦点.过0.5~1秒焦点回来.导致输入无法正常工作,严重影响使用心情和效率. 在网上找了非常久,也没 ...
- 初步探讨WPF的ListView控件(涉及模板、查找子控件) - GavinJun
本文结合模板的应用初步介绍ListView的应用 一.Xaml中如何建立数据资源 大部分数据都会来自于后台代码,如何Xaml同样的建立数据源呢?比如建立一个学生List: 首先引入命名空间: xmln ...
- css常用总结
1.固定一个层在页面的位置,不受滚动条影响, 属性position:fixed,如: .tbar{ height:200px;width:60px;background-color:#666;posi ...
- EasyNVR将如何能够把内网各种各样的监控摄像机对接到公网云平台
需求 传统监控行业里面,监控客户端.服务器端,设备端都在一个内网里面,搞个电脑开个监控终端,顶多再配一个NVR做一做摄像机的录像存储.上个电视墙(个人感觉这功能除了面子工程,没啥实用的,还特费电!), ...
- Node.js安装及环境配置(windows)
1.Node.js简介 简单的说 Node.js 就是运行在服务端的 JavaScript.Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境.Node.js 使用 ...
- lateral inhibition
http://www.indiana.edu/~p1013447/dictionary/lat_i.htm [This means that neighboring visual neurons re ...
- Java,获取文件的Base64字符串,解码Base64字符串还原文件
在jdk1.8以前,获取文件Base64字符串需要用到第三方库,从1.8开始,Java中引入了Base64相关的类 以下是代码示例 获取文件的Base64编码字符串 import java.io.Fi ...
- 【LeetCode】Search in Rotated Sorted Array II(转)
原文链接 http://oj.leetcode.com/problems/search-in-rotated-sorted-array-ii/ http://blog.csdn.net/linhuan ...