代码改变世界

详解as3中flashplayer11.5新推出的多线程同步技术[准备篇]

2013-03-31 19:21  阿诚de窝  阅读(1442)  评论(0编辑  收藏  举报

最近心血来潮想仔细的学习一下AS3中的多线程,其实早在11.4时就已经学过AS3的多线程怎么用了,当时主要还是靠网上的搜罗;之前了解过11.5中会升级多线程,加入了ByteArray共享的功能,心想现在11.7都快出了,应该有11.5的多线程的资料了吧,结果我只找到了一点零星的资料:

http://not-so-stupid.com/as3-concurrency-workers-shared-bytearray-mutex/

http://www.bytearray.org/?p=4423(翻译:http://www.erlangsir.com/2012/09/03/actionscript-workers-%E5%B9%B6%E5%8F%91/

好吧,其实我找到的资料对我来说没有什么用,只是提到了点11.5的相关信息;目前这一块算是一个空白,所以我打算专门为此写一个系列的教程。

 

先总体了解一下:

Flashplayer 11.4引入了worker(就是俗称的多线程了,其实准确一点的说应该是叫并发),说白了其实就是在同一个Player中运行另一个swf文件(但是不显示)并且使其可以和当前的主swf通信而已;有些人把swf文件和MovieClip等同,因为Loader加载swf后就解码为一个MovieClip了;注意这里不是,Loader加载的swf还是在主线程中运行其变为MovieClip;而worker加载的swf字节码会变为Worker,在一个新的线程中运行

而Flashplayer 11.4中虽然加入了多线程,但是却没有同步技术的支持!众所周知,多线程会导致一些问题,而需要通过同步来处理这些问题,加入同步技术后该线程则可称为线程安全,反之则线程不安全;

那么为什么11.4中加入了多线程却没有同步技术的支持呢? 答案在这里:11.4中多个线程之间共享的数据对象和收发的消息对象都是创建副本而不是使用引用!

11.4中多个线程之间数据的共享和通信可以使用Worker类的setSharedProperty和getSharedProperty方法来处理,我可以在线程A设置一个任意类型的对象,在线程B中再取出来用;或者使用MessageChannel的send和receive方法来传递任意的对象;不过这里有一个问题:设置和传递的任意对象都不是引用,而是新创建的一模一样的副本!所以多个线程之间不会存在共享同一个数据的问题,我在线程A中改变了一个对象的值,该对象在线程B中的值并不会被改变,因为他们就不是同一个对象;既然多线程不会存在共享同一个数据的话,也就没有必要使用同步技术了。

但是11.5中终于有一个类,它打破了这条规矩,它就是我们万能的ByteArray!!!(鼓掌...) 如果ByteArray对象的shareable属性被设置为true,那么它在setSharedProperty和getSharedProperty方法以及send和receive方法中都将传递引用而不是创建副本,其好处是可以减低内存的使用,试想如果两个线程之间传递大尺寸的对象还是用创建副本的话内存会怎样?(注意其他的对象和shareable属性为false的ByteArray任然是拷贝副本)

坏处是线程不再安全;想一想,线程A和线程B同时拥有一个ByteArray的引用,由于两个线程的运行是并发的,那么A和B可能会同时操作同一个ByteArray;模拟一下:线程A向ByteArray中循环添加1到100;而B向ByteArray中循环添加101到200;可能会出现线程A添加到50的时候CPU资源被B抢到了,线程B启动并执行完毕然后才是A继续执行,那么ByteArray的内容是:1-50 101-200 51-100; 上面的情况可以说是数据被损坏了;所以11.5加入了同步技术来避免上面的问题的出现;

 

我们看看11.5中Woker类的setSharedProperty和getSharedProperty方法及MessageChannel的send和receive方法会使用引用而不是拷贝副本的对象都有那些:

1.Worker

2.MessageChannel

3.可共享 ByteArray(其 shareable 属性设为 true 的 ByteArray 对象)

4.Mutex

5.Condition

后面两个对象相信很多ASer都没见过,没关系,它们两就是咱们接下来要谈的主角。

 

对AS3中多线程和同步感兴趣的童鞋有福了,因为后面的内容是绝对的干货;

最后说说大家需要先了解的东西:

1.了解基本的worker如何使用(就是已经能弄一个线程出来运行并且可以和主线程通信),还没有了解的童鞋请先移步(看完第一篇即可): http://bbs.9ria.com/thread-144587-1-1.html http://bbs.9ria.com/thread-145065-1-1.html http://bbs.9ria.com/thread-145729-1-1.html

2.Flash builder 4.7,因为其添加了对worker的支持,我们就不需要自己手动打包作为线程的swf再嵌入主swf了,更加方便,还不会用的童鞋移步(主要看worker怎么用): http://news.9ria.com/2012/0829/24911.html

3.playerglobal11.5以上的swc和添加-swf-vwesion,下载地址: http://www.adobe.com/support/flashplayer/downloads.html