A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© a80C51 中级黑马   /  2015-9-29 23:37  /  642 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1)使用wait()、notify()和notifyAll()三个方法,来控制线程之间的调度。
2)上述三个方法属于Object类,必须由同步监视器来调用。
3)三种方法的解释:
        a,wait(),导致当前线程等待,直到其他线程调用该同步监视器的notify()方法或者notifyAll()方法来唤醒该线程。
        b,notify(),唤醒在此同步监视器上等待的单个线程,如果所有的线程都在此同步监视器上等待,则会选择唤醒其中一个,只有当前线程放弃锁定后,才可以执行被唤醒的线程;
        c,notifyAll(),唤醒在此同步监视器上等待的所有线程。只有当前线程放弃对该同步监视器的锁定后,才可以执行被唤醒的线程。
4)源码示例
//Account.java代码
  1. package com.wayne.practice;

  2. public class Account {
  3.         private String accountNo;
  4.         private double balance;
  5.        
  6.         //设置是否账户中是否有钱的标志
  7.         private boolean bFlagHasMoney = false;
  8.        
  9.         public Account(){}

  10.         public Account(String accountNo, double balance) {
  11.                 super();
  12.                 this.accountNo = accountNo;
  13.                 this.balance = balance;
  14.         }

  15.         public String getAccountNo() {
  16.                 return accountNo;
  17.         }

  18.         public void setAccountNo(String accountNo) {
  19.                 this.accountNo = accountNo;
  20.         }

  21.         public double getBalance() {
  22.                 return balance;
  23.         }

  24.         @Override
  25.         public int hashCode() {
  26.                 return accountNo.hashCode();
  27.         }

  28.         @Override
  29.         public boolean equals(Object obj) {
  30.                 if(this == obj)
  31.                         return true;
  32.                
  33.                 if((obj != null)&&(obj.getClass() == Account.class))
  34.                 {
  35.                         Account account = (Account)obj;
  36.                         if(this.getAccountNo().equals(account.getAccountNo()))
  37.                                         return true;
  38.                 }
  39.                
  40.                 return false;
  41.         }
  42.        
  43.         //定义取钱的动作
  44.         public synchronized void draw(double drawMoney)
  45.         {
  46.                 if(!bFlagHasMoney)
  47.                 {
  48.                         try {
  49.                                 wait();//如果bFlagHasMoney为假,则表示账户中没有钱,阻塞该取钱
  50.                         } catch (InterruptedException e) {
  51.                                 // TODO Auto-generated catch block
  52.                                 e.printStackTrace();
  53.                         }
  54.                 }
  55.                 else
  56.                 {
  57.                         System.out.println(Thread.currentThread().getName()+
  58.                                         " 取款:"+drawMoney+"元!");
  59.                         this.balance-=drawMoney;
  60.                         System.out.println("账户余额为:"+this.getBalance());
  61.                         bFlagHasMoney = false;
  62.                         notifyAll();
  63.                 }
  64.         }
  65.        
  66.         //定义存钱动作
  67.         public synchronized void deposit(double depositMoney)
  68.         {
  69.                 if(bFlagHasMoney)
  70.                 {
  71.                         try {
  72.                                 wait();////如果bFlagHasMoney为真,则表示账户中有钱,阻塞其他用户存钱
  73.                         } catch (InterruptedException e) {
  74.                                 // TODO Auto-generated catch block
  75.                                 e.printStackTrace();
  76.                         }
  77.                 }
  78.                 else
  79.                 {
  80.                         System.out.println(Thread.currentThread().getName()+
  81.                                         " 存款:"+depositMoney+"元");
  82.                         this.balance += depositMoney;
  83.                         System.out.println("账户余额为:"+this.getBalance());
  84.                         bFlagHasMoney = true;
  85.                         notifyAll();
  86.                 }
  87.         }
  88.        
  89. }
复制代码

//DepositMoneyThread.java代码
  1. package com.wayne.practice;
  2. //定义取钱的线程
  3. public class DepositMoneyThread extends Thread {
  4.        
  5.         private Account account;
  6.         private double depositMoney;

  7.         public DepositMoneyThread(){}
  8.        
  9.         public DepositMoneyThread(String thrName,Account account,double depositMoney)
  10.         {
  11.                 super(thrName);
  12.                 this.account = account;
  13.                 this.depositMoney = depositMoney;
  14.         }
  15.        
  16.         @Override
  17.         public void run() {
  18.                 // TODO Auto-generated method stub
  19.                 for(int i = 0;i<10;i++)
  20.                         account.deposit(depositMoney);;
  21.         }
  22.        
  23. }
复制代码

//DrawMoneyThread.java代码
  1. package com.wayne.practice;
  2. //定义取钱的线程
  3. public class DrawMoneyThread extends Thread {
  4.        
  5.         private Account account;
  6.         private double drawMoney;

  7.         public DrawMoneyThread(){}
  8.        
  9.         public DrawMoneyThread(String thrName,Account account,double drawMoney)
  10.         {
  11.                 super(thrName);
  12.                 this.account = account;
  13.                 this.drawMoney = drawMoney;
  14.         }
  15.        
  16.         @Override
  17.         public void run() {
  18.                 // TODO Auto-generated method stub
  19.                 for(int i = 0;i<10;i++)
  20.                         account.draw(drawMoney);
  21.         }
  22.        
  23. }
复制代码

//AccountAppk.java代码
package com.wayne.practice;

public class AccountApp {

        public static void main(String[] args) {
                // TODO Auto-generated method stub
                Account acct = new Account("123456",0);
               
                new DrawMoneyThread("取款者", acct, 800).start();
                new DepositMoneyThread("存款者甲", acct, 800).start();
                new DepositMoneyThread("存款者乙", acct, 800).start();
                new DepositMoneyThread("存款者丙", acct, 800).start();
        }

}

2 个回复

倒序浏览
你这个这么多代码,需求和注释都没有怎么看啊
回复 使用道具 举报
lostyou 发表于 2015-9-29 23:54
你这个这么多代码,需求和注释都没有怎么看啊

主要是练习notifyAll的wait的用法,至于需求。其实可以自定义的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马