我们知道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
源码我就不贴了,大家请自行下载: