实验一 多线程同步处理 java
更新时间:2024-02-27 02:39:01 阅读量: 综合文库 文档下载
- 实验一小推荐度:
- 相关推荐
实验一:多线程同步处理
实现内容:编写一多线程程序,实现对某一银行帐户的存取款操作。
要求:多个用户均可操作该帐户,存款随意存,取款要求帐户的余额足够才能取(不能透支)。每一项存取款操作均要互斥进行。
参考资料:http://lavasoft.blog.51cto.com/62575/27069
前半部分代码:
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;
import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* Java线程:条件变量 *
* @author leizhimin 2009-11-5 10:57:29 */
public class Test {
public static void main(String[] args) { //创建并发访问的账户
MyCount myCount = new MyCount(\, 10000); //创建一个线程池
ExecutorService pool = Executors.newFixedThreadPool(2); Thread t1 = new SaveThread(\张三\, myCount, 2000); Thread t2 = new SaveThread(\李四\, myCount, 3600); Thread t3 = new DrawThread(\王五\, myCount, 14100); Thread t4 = new SaveThread(\老张\, myCount, 600); Thread t5 = new DrawThread(\老牛\, myCount, 1300); Thread t6 = new DrawThread(\胖子\, myCount, 800); //执行各个线程
pool.execute(t1); pool.execute(t2); pool.execute(t3); pool.execute(t4); pool.execute(t5); pool.execute(t6); //关闭线程池
pool.shutdown(); } }
/**
* 存款线程类 */
class SaveThread extends Thread {
private String name; //操作人 private MyCount myCount; //账户
private int x; //存款金额
SaveThread(String name, MyCount myCount, int x) { this.name = name;
this.myCount = myCount; this.x = x; }
public void run() {
System.out.println(name+\存款操作\+x); myCount.saving(x, name); } }
/**
* 取款线程类 */
class DrawThread extends Thread {
private String name; //操作人 private MyCount myCount; //账户
private int x; //存款金额
DrawThread(String name, MyCount myCount, int x) { this.name = name;
this.myCount = myCount; this.x = x; }
public void run() { System.out.println(name+\取款操作\+x); myCount.drawing(x, name); } }
后半部分代码:
MyCount的三种实现方法: 方法一:
/** 条件变量的实现方式 * 普通银行账户,不可透支 */
class MyCount {
private String oid; //账号
private int cash; //账户余额
private Lock lock = new ReentrantLock(); //账户锁 。一次只能有一个线程获得锁。
private Condition _draw = lock.newCondition(); //取款条件
MyCount(String oid, int cash) { this.oid = oid; this.cash = cash; }
/** * 存款 *
* @param x 操作金额 * @param name 操作人 */
public void saving(int x, String name) {
lock.lock(); //获取锁 if (x > 0) {
cash += x; //存款
System.out.println(name + \存款\ + x + \,当前余额为\ + cash);
}
_draw.signalAll(); //唤醒所有等待线程。
lock.unlock(); //释放锁 }
/** * 取款 *
* @param x 操作金额 * @param name 操作人 */
public void drawing(int x, String name) {
lock.lock(); //获取锁 try {
while (cash - x < 0) {
_draw.await(); //阻塞取款操作 }
cash -= x; //取款
System.out.println(name + \取款\ + x + \,当前余额为\ + cash);
_draw.signalAll(); //唤醒所有等待线程。 } catch (InterruptedException e) { e.printStackTrace(); } finally {
lock.unlock(); //释放锁 } } }
方法二:
/** 利用 同步方法 来实现 * 普通银行账户,不可透支 */
class MyCount {
private String oid; //账号
private int cash; //账户余额
MyCount(String oid, int cash) { this.oid = oid; this.cash = cash; }
/** * 存款 *
* @param x 操作金额 * @param name 操作人 */
/* synchronized
* Java中每个对象都有一个内置锁
当程序运行到非静态的synchronized同步方法上时,自动获得与正在执行代码类的当前实例
(this实例)有关的锁。获得一个对象的锁也称为获取锁、锁定对象、在对象上锁定或在对象上同步。
当程序运行到synchronized同步方法或代码块时才该对象锁才起作用。
一个对象只有一个锁。所以,如果一个线程获得该锁,就没有其他线程可以获得锁,直到第一个线程释放(或返回)锁。这也意味着任何其他线程都不能进入该对象上的synchronized方法或代码块,直到该锁被释放。
释放锁是指持锁线程退出了synchronized同步方法或代码块。
关于锁和同步,有一下几个要点:
1)、只能同步方法,而不能同步变量和类; 2)、每个对象只有一个锁;当提到同步时,应该清楚在什么上同步?也就是说,在哪个对象上同步? 3)、不必同步类中所有的方法,类可以同时拥有同步和非同步方法。
4)、如果两个线程要执行一个类中的synchronized方法,并且两个线程使用相同的实例来调用方法,那么一次只能有一个线程能够执行方法,另一个需要等待,直到锁被释放。也就是说:如果一个线程在对象上获得一个锁,就没有任何其他线程可以进入(该对象的)类中的任何一个同步方法。
5)、如果线程拥有同步和非同步方法,则非同步方法可以被多个线程自由访问而不受锁的限制。
* */
public synchronized void saving(int x, String name) { if (x > 0) {
cash += x; //存款
System.out.println(name + \存款\ + x + \,当前余额为\ + cash);
}
notifyAll(); //唤醒所有等待线程。 }
/** * 取款 *
* @param x 操作金额 * @param name 操作人 */
public synchronized void drawing(int x, String name) { while (cash - x < 0) { try {
wait();
} catch (InterruptedException e1) { e1.printStackTrace(); } }
cash -= x; //取款
System.out.println(name + \取款\ + x + \,当前余额为\ + cash);
notifyAll(); //唤醒所有存款操作 } }
方法三:
/** 利用同步代码块来实现 * 普通银行账户,不可透支 */
class MyCount {
private String oid; //账号
private int cash; //账户余额
MyCount(String oid, int cash) { this.oid = oid; this.cash = cash; }
/** * 存款 *
* @param x 操作金额 * @param name 操作人 */
public void saving(int x, String name) { if (x > 0) {
synchronized (this) {
cash += x; //存款
System.out.println(name + \存款\ + x + \,当前余额为\ + cash);
notifyAll(); //唤醒所有等待线程。 } } }
/** * 取款 *
* @param x 操作金额 * @param name 操作人 */
public synchronized void drawing(int x, String name) { synchronized (this) {
while (cash - x < 0) { try {
wait();
} catch (InterruptedException e1) { e1.printStackTrace(); } }
cash -= x; //取款
System.out.println(name + \取款\ + x + \,当前余额为\ + cash);
}
notifyAll(); //唤醒所有存款操作 } }






正在阅读:
实验一 多线程同步处理 java02-27
智能楼宇管理师理论复习资料12-26
ANSYS命令汇总05-31
倒送电方案03-19
小学生三年级童年故事作文06-13
关于个人年终工作总结ppt案例范文04-28
2017年济宁教师招聘考试教育基础知识部分真题及答案解析04-03
剑桥雅思真题5听力试题及文本材料超值奉献09-05
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 线程
- 同步
- 实验
- 处理
- java
- 2015年会计从业考试知识点《会计电算化》:数据的保护每日一练(
- 人类起源-七年级上册第六单元作文指导
- 对电力系统自动化控制技术的分析与探讨
- 统计从业资格考试训练题及答案
- 面试的10个案例问题
- 音标--教案
- 放射性气体扩散的预估3
- 医院工程主要施工管理措施
- 土地利用管理
- 新课改下的高中历史教学
- OBD2诊断程序开发
- 单片机十套试题卷单片机原理及应用
- 西南大学《英语阅读二》复习思考题及答案
- 营养素的需要量每日一练(2015.12.2)
- 现代文阅读专题三 - 分析作品的表现手法(1)学生
- 2017年全区国家工作人员学法用法考试
- 人教版 小学8年级 数学上册《全等三角形》《轴对称》期末复习提
- 医疗废物集中处置个人防护制度
- 黑枸杞泡酒的比例及功效
- 长宁区2016初三英语一模试题