首页 > 代码库 > Java多线程协调控制之wait¬ifyAll
Java多线程协调控制之wait¬ifyAll
最近在复习Java基础,看到多线程这块顺便写写多线程的协调控制程序。
需求:假设系统中有两个线程分别代表取款者和存款者,现在系统的要求是存款者和取款者不断的重复存、取款操作,
并且要求每当有存款者将钱存入指定账户中时,取款者就立即取出这笔钱,即不允许存款者连续两次存钱,也不允许
取款者两次取钱。
下面代码实现:
1.首先是账户Account类;
package com.xjtu.cruise.soft.thread; public class Account { /** * @author Cruise * @param args */ private String accountNo; //标识账户是否还有存款的 private boolean flag = false; private double balance; public Account(){} public Account(String accountNo, double balance) { this.accountNo = accountNo; this.balance = balance; } public double getBalance(){ return balance; } public synchronized void draw(double drawAmount) { try { if (!flag) { //如果账户没钱 wait(); //阻塞当前的方法,并释放同步锁(这里就是this,也就是调用此方法的对象) } else { System.out.println("线程:" + Thread.currentThread().getName() + "取款" + drawAmount); balance -= drawAmount; System.out.println("账户余额:" + balance); flag = false; notifyAll(); //唤醒等待此同步锁的所有线程 } } catch (InterruptedException e) { e.printStackTrace(); } } public synchronized void deposit(double depositAmount) { try{ if(flag){ //如果账户有存入的钱 wait(); }else{ System.out.println("线程:"+ Thread.currentThread().getName()+"存款"+depositAmount); balance += depositAmount; System.out.println("账户余额:" + balance); flag = true; notifyAll(); } }catch(InterruptedException e){ e.printStackTrace(); } } }
2.接下来是存取款线程类(DrawThread,DepositThread)
package com.xjtu.cruise.soft.thread; public class DepositThread extends Thread { private Account account; private double depositAmount; public DepositThread(String name, Account account, double depositAmount) { super(name); this.account = account; this.depositAmount = depositAmount; } public void run(){ for(int i=0; i<100; i++){ // System.out.println("线程:" + Thread.currentThread().getName()+"执行存款操作。"); account.deposit(depositAmount); } } }
package com.xjtu.cruise.soft.thread; public class DrawThread extends Thread { /** * @author Cruise * @param args */ private Account account; private double drawAmount; public DrawThread(String name, Account account, double drawAmount) { super(name); this.account = account; this.drawAmount = drawAmount; } public void run(){ for(int i=0; i<100; i++){ // System.out.println("线程:" + Thread.currentThread().getName()+"执行取钱操作。"); account.draw(drawAmount); } } }
3.奉上测试类TestDraw
package com.xjtu.cruise.soft.thread; public class TestDraw { /** * @author Cruise * @param args */ public static void main(String[] args) { Account account = new Account("123", 0); new DrawThread("取钱者", account, 800).start(); new DepositThread("存款者甲",account, 800).start(); new DepositThread("存款者乙",account, 800).start(); } }
OK, 一个线程协调控制的Demo完成。
Java多线程协调控制之wait¬ifyAll
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。