zoukankan      html  css  js  c++  java
  • 对await(),notify()的理解

    await(),notify()是java Object类的方法.在两个线程同时访问一个对象的时候可以利用这2个方法实现线程的通信.看下面的例子.

    public class Account {
        private String accountNo;
        private double balance;
        private boolean flag = false;
        public Account() {
        }
        public Account(String accountNo, double balance) {
            this.accountNo = accountNo;
            this.balance = balance;
        }
        public void setAccountNo(String accountNo) {
            this.accountNo = accountNo;
        }
        public String getAccountNo() {
            return this.accountNo;
        }
        public double getBalance() {
            return this.balance;
        }
        public synchronized void draw(double drawAmount) {
            try {
                //如果flag为假,表明账户中还没有人存钱进去,则取钱方法阻塞
                if (!flag) {
                    wait();
                } else {
                    System.out.println(Thread.currentThread().getName() +
                            " 取钱:" + drawAmount);
                    balance -= drawAmount;
                    System.out.println("账户余额为:" + balance);
                    //将标识账户是否已有存款的旗标设为false。
                    flag = false;
                    notify();
                }
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
        }
        public synchronized void deposit(double depositAmount) {
            try {
                //如果flag为真,表明账户中已有人存钱进去,则存钱方法阻塞
                if (flag) {
                    wait();
                } else {
                    //执行存款
                    System.out.println(Thread.currentThread().getName() +
                            " 存款:" + depositAmount);
                    balance += depositAmount;
                    System.out.println("账户余额为:" + balance);
                    //将表示账户是否已有存款的旗标设为true
                    flag = true;
                    //唤醒其他线程
                    notify();
                }
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
        }
    }
    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++) {
                account.deposit(depositAmount);
            }
        }
    }
    public class DrawThread extends Thread {
        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++) {
                account.draw(drawAmount);
            }
        }
    }
    public class TestDraw {
        public static void main(String[] args) {
            Account acct = new Account("1234567", 0);
            new DrawThread("取钱者", acct, 800).start();
            new DepositThread("存款者甲", acct, 800).start();
        }
    }
    

    DepositThread线程负责存钱,DrawThread线程负责取钱.flag为true时表示有钱,DepositThread线程调用await实现等待.flag为false时表示没有钱,DrawThread线程调用await实现等待.当flag为true时DrawThread实现取钱,之后调用notify(),通知DepositThread可以来存钱.当flag为false时DepositThread实现存钱,之后调用notify(),通知DrawThread可以来存钱.

  • 相关阅读:
    20155333 《网络对抗》 Exp6 信息搜集与漏洞扫描
    20155333 《网络对抗》 Exp5 MSF基础应用
    20155333 《网络对抗》Exp4 恶意代码分析
    20155333 《网络对抗》Exp3 免杀原理与实践
    20155333 《网络对抗》Exp2 后门原理与实践
    2017-2018-2 20155333 《网络对抗技术》 Exp1 PC平台逆向破解
    2017-2018-1 20155333 《信息安全系统设计基础》第三周学习总结
    内核模块实践实验报告
    Linux内核期末总结
    Linux内核期中
  • 原文地址:https://www.cnblogs.com/zhouyang209117/p/5322310.html
Copyright © 2011-2022 走看看