详解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

天道酬勤,功不唐捐!
原文地址:https://www.cnblogs.com/hammerc/p/3021767.html