zoukankan      html  css  js  c++  java
  • Java 多线程 条件变量

    1 背景知识

        在jdk1.5中引入了新特性:条件对象(condition varialbe)。什么是条件对象呢? 他是干什么用的呢?就是在一个线程在获得了锁,却不能开始执行有用工作的线程。

    2 例子

        在一个银行业务中,当我们执行了转账函数后,而帐号中金钱不足了。我们的需求是让该帐号处于等待状态,等待再次被唤醒,从而再次去判断是否有金钱,判断是否进行执行后面的程序。

        使用方法:

        1 Lock lock = new ReentrantLock()

        2 Condition condition = lock.newCondition();

        方法介绍:

        condition.await():把该线程放到条件的等级集中去。

        condition.signalAll():解除该条件的等待所有线程的阻塞状态。

    1 /**
    2 * 转账
    3 *
    4 * @param from
    5 * 钱从这里消失
    6 * @param to
    7 * 钱流到这里来了
    8 * @param amount
    9 * 钱的数量
    10 * @return 是否成功
    11 */
    12 public void transfer(int from, int to, double amount) {
    13
    14 try {
    15 lock.lock();
    16 if (account[from] - amount < 0) {
    17 System.out.println("from " + from + "帐号中余额不足,暂停执行");
    18 //使用条件变量,线程中断
    19   condition.await();
    20 System.out.println("from " + from + "帐号中余额不足,唤醒执行");
    21 }
    22 account[from] -= amount;
    23 account[to] += amount;
    24
    25 System.out.printf("from:%d,to:%d,transfer:%10.2f ", from, to, amount);
    26
    27 System.out.println("sum:" + this.getTotleBalance());
    28
    29 //使所有线程变为“可运行”状态
    30   condition.signalAll();
    31 } catch (InterruptedException e) {
    32 // TODO Auto-generated catch block
    33 e.printStackTrace();
    34 } finally {
    35 lock.unlock();
    36 }
    37
    38 }

  • 相关阅读:
    HTML连载29-div和span标签
    Java连载14-补码简介&浮点型整数
    Java连载13-整数型字面值的强制转换
    Java连载12-继承开发环境&long类型
    [Python] tkinter 之 Listbox & Combobox
    [Python] Tkinter command
    [java] 转型
    [Python] execl读写
    [c++] 细节
    [刷题] PTA 7-64 最长对称子串
  • 原文地址:https://www.cnblogs.com/xitang/p/1931250.html
Copyright © 2011-2022 走看看