• 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 }

  • 相关阅读:
    被刷登录接口
    移动端布局方案
    容易遗忘的Javascript点
    java 笔记02
    java 笔记01
    C# 日常整理
    reac-native 0.61开发环境
    DOS命令收集
    vue整理日常。
    php7.1+apache2.4.x+mysql5.7安装配置(目前windows)
  • 原文地址:https://www.cnblogs.com/xitang/p/1931250.html
Copyright © 2020-2023  润新知