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 }

  • 相关阅读:
    hdu 1213 (How Many Tables)(简单的并查集,纯模板)
    Android 开发 -------- 自己定义View 画 五子棋
    POJ 2472 106 miles to Chicago
    android application
    Effective C++:条款39:明智而审慎地使用private继承
    云计算统一办公运营平台服务能力设计方案
    LCA 近期公共祖先 小结
    MFC exe使用C++ dll中的std::string 崩溃
    函数调用堆栈图
    【cocos2d-js官方文档】二十、moduleConfig.json
  • 原文地址:https://www.cnblogs.com/xitang/p/1931250.html
Copyright © 2011-2022 走看看