zoukankan      html  css  js  c++  java
  • 详解as3中flashplayer11.5新推出的多线程同步技术[第三步:Condition是啥]

    我们知道AS3中实现同步使用的是Mutex类,那么Condition可以看做扩展了Mutex类功能的类,首先我们看看Condition的构造方法:

    public function Condition(mutex:Mutex)

    说明Condition类是基于一个Mutex对象的,且其mutex属性为只读,说明其扩展了某一个Mutex对象就不能更改为其它的Mutex对象;

    再看看Condition提供的方法:

    public function notify():void
    public function notifyAll():void
    public function wait(timeout:Number = -1):Boolean

    大家学Worker时一定很纳闷,有start开始运行、有terminate终止运行,怎么没有sleep或者wait方法来暂停线程运行呢?看到这里是不是忽然明白了,暂停执行的方法被放到Condition类中了,而且可以指定暂停的时间;当一个Condition对象调用wait方法后,该对象所在的线程就会暂停指定的时间,-1表示一直暂停执行;

    好的,我们再看看Condition的意思是啥?(为了照顾和我一样英语没过4级的童鞋)

    condition  [kən'diʃən] 
    n.条件, 情况
    v.训练, 决定, 以 ... 为条件, 护理(头发)

    Condition是条件的意思:即线程执行的条件,满足条件可以执行,不满足条件可以暂停的意思;

    wait方法可以暂停当前线程,那么相应的notify和notifyAll就是继续运行的方法,由于同一时间一个Condition对象可能暂停了多个线程,所以无论再哪个线程中调用notify或notifyAll方法都会导致等待中的多个线程中的一个线程继续执行;好吧就是这么简单。

    那么notify和notifyAll有啥区别呢?

    API文档:

    notify():void
    指定此 Condition 对象表示的条件已经满足,mutex 的所有权将被返回给正等待此条件的下一个 worker(如果有)。

    notifyAll():void
    指定此 Condition 对象表示的条件已经满足,mutex 的所有权将被返回给正等待此条件的所有 worker。

    好吧,我抄录了Java中的notify和notifyAll区别供各位看官参考:

    notify和notifyAll最大区别在于:
    notifyAll使所有原来在该对象上等待被notify的线程统统退出wait的状态,变成等待该对象上的锁,一旦该对象被解锁,他们就会去竞争。
    notify他只是选择一个wait状态线程进行通知,并使它获得该对象上的锁,但不惊动其他同样在等待被该对象notify的线程们,当第一个线程运行完毕以后释放对象上的锁,此时如果该对象没有再次使用notify语句,即便该对象已经空闲,其他wait状态等待的线程由于没有得到该对象的通知,继续处在wait状态,直到这个对象发出一个notify或notifyAll,它们等待的是被notify或notifyAll,而不是锁。

    下面我们直接上一个实例:

    创建ConditionDemo工程,主线程和子线程同时运行,子线程向共享字节流中写入一个字符串,主线程则读出该字符串,注意我们没有使用MessageChannel来实现,而是用Condition来实现;

    当共享字节流中没有数据时主线程会暂停,子线程写入数据后调用notify方法通知主线程后暂停,主线程继续运行后发现存在数据读出该数据,同时调用notify方法通知子线程后暂停;如此反复20次,输出如下:

     1 写入数据 43
     2 读出数据: 这次程序能不能跑通啊?!46
     3 写入数据 48
     4 读出数据: 这次程序能不能跑通啊?!50
     5 写入数据 54
     6 读出数据: 这次程序能不能跑通啊?!56
     7 写入数据 58
     8 读出数据: 这次程序能不能跑通啊?!60
     9 写入数据 61
    10 读出数据: 这次程序能不能跑通啊?!63
    11 写入数据 67
    12 读出数据: 这次程序能不能跑通啊?!69
    13 写入数据 71
    14 读出数据: 这次程序能不能跑通啊?!73
    15 写入数据 75
    16 读出数据: 这次程序能不能跑通啊?!77
    17 写入数据 80
    18 读出数据: 这次程序能不能跑通啊?!82
    19 写入数据 84
    20 读出数据: 这次程序能不能跑通啊?!87
    21 写入数据 89
    22 读出数据: 这次程序能不能跑通啊?!91
    23 写入数据 94
    24 读出数据: 这次程序能不能跑通啊?!96
    25 写入数据 100
    26 读出数据: 这次程序能不能跑通啊?!101
    27 写入数据 103
    28 读出数据: 这次程序能不能跑通啊?!106
    29 写入数据 108
    30 读出数据: 这次程序能不能跑通啊?!110
    31 写入数据 113
    32 读出数据: 这次程序能不能跑通啊?!116
    33 写入数据 118
    34 读出数据: 这次程序能不能跑通啊?!120
    35 写入数据 123
    36 读出数据: 这次程序能不能跑通啊?!126
    37 写入数据 128
    38 读出数据: 这次程序能不能跑通啊?!131
    39 写入数据 135
    40 读出数据: 这次程序能不能跑通啊?!137

    源码我就不贴了,大家请自行下载:

    http://vdisk.weibo.com/s/xRVWc

    天道酬勤,功不唐捐!
  • 相关阅读:
    Oracle数据库event事件与dump文件介绍
    (原)dbms_rowid.rowid_create来创建一个rowid
    Oracle读取事件的命名理由(哈哈)
    关于删除temporary tablespace的一点小建议
    oracle的rowid到底是什么
    电脑高手最常用的五个组合键
    win2008里如何取消IE游览器弹出增强的安全配置?
    经典SQL语句大全
    Win7中安装Rational Rose,启动提示计算机丢失suite objects.dll
    Asp.net页面跳转
  • 原文地址:https://www.cnblogs.com/hammerc/p/3021767.html
Copyright © 2011-2022 走看看