开源项目async-threading能使as3支持多线程,google code地址:http://code.google.com/p/async-threading/
要在flex4 sdk环境下使用,要先修改一下源代码,打开com.symantec.premiumServices.asyncThreading.handlers.FPSObserverHandler
将import mx.core.Application; 修改为import spark.components.Application;
将private var _appRef:Application = Application.applicationas Application;修改为private var _appRef:Application = FlexGlobals.topLevelApplication as Application;
同时导入import mx.core.FlexGlobals;
这个api要求自定义的线程继承AbstractAsyncThread然后实现IAsyncThreadResponder接口,写一个测试用线程:
package thread
{
import com.symantec.premiumServices.asyncThreading.abstract.AbstractAsyncThread;
import com.symantec.premiumServices.asyncThreading.interfaces.IAsyncThreadResponder;
/**
* 自定义线程
*/
public class SelfDefinedThread extends AbstractAsyncThread implements IAsyncThreadResponder
{
private var f:Function;
public function SelfDefinedThread(f:Function)
{
super();
this.f = f;
}
public function execute():void
{
f.call();
}
}
}
这个api还是比较强大的,基本线程操作和通讯都能实现了,具体可以看附件内的源代码api。
这个线程的构造函数要传入一个方法,这个方法将在线程启动后调用。
测试代码:
<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
creationComplete="testThread()">
<fx:Declarations>
<!-- 将非可视元素(例如服务、值对象)放在此处 -->
</fx:Declarations>
<fx:Script>
<![CDATA[
import thread.SelfDefinedThread;
private function testThread():void{
//线程1
var thread1:SelfDefinedThread = new SelfDefinedThread(
function():void{
trace("线程1执行");
trace("开启线程2");
thread2.start();
});
//线程2
var thread2:SelfDefinedThread = new SelfDefinedThread(
function():void{
trace("线程2执行");
if(thread1.sleeping)
{
thread1.kill();
thread2.kill();
thread3.kill();
trace("线程1,2,3终止");
}else{
trace("开启一个线程3");
thread3.start();
}
});
//线程3
var thread3:SelfDefinedThread = new SelfDefinedThread(
function():void{
trace(thread3.id + "线程3执行");
if(!thread1.sleeping)
{
thread1.sleep();
trace("线程1休眠");
}
});
thread1.priority = thread1.RUN_LEVEL_HIGH;
thread2.priority = thread2.RUN_LEVEL_BELOW_NORMAL;
thread1.start();
}
]]>
</fx:Script>
<s:Label x="281" y="122" text="多线程测试"/>
</s:WindowedApplication>
用调试模式执行就能看到结果: