不多说了先上代码吧
module com
{
export class JTLocker implements JTITaskLocker
{
protected __fail:Function = null;
protected __succeed:Function = null;
protected __signal:Promise<any> = null;
public lock():Promise<any>
{
if (this.__signal) return this.__signal; //注意,当前正使用锁时,如果没有调用release 时不能再使用lock()方法
let locker:JTLocker = this;
this.__signal = new Promise((resolve, reject) =>
{
locker.__fail = reject;
locker.__succeed = resolve;
})
return this.__signal;
}
public release():void
{
this.__succeed && this.__succeed.apply(this, []);
this.clear();
}
public kill():void
{
this.__fail && this.__fail.apply(this, []);
this.clear();
}
public locked():boolean
{
return this.__signal != null;
}
public tryLock():Promise<any>
{
return this.locked() ? this.__signal : this.lock();
}
public get signal():Promise<any>
{
return this.__signal;
}
public clear():void
{
this.recycle();
}
public recycle()
{
this.__signal = this.__fail = this.__succeed = null;
}
// private static _pool:JTIPool = JTPool.instance(JTLocker);
// public static create():JTILocker
// {
// let locker:JTILocker = this._pool.get() as JTLocker;
// return locker;
// }
// public static put(locker:JTLocker):void
// {
// this._pool.put(locker);
// }
}
}
JTILocker ---接口
module com
{
export interface JTILocker extends JTIPoolObject
{
lock(key?:any):Promise<any>
release():void
unlock(key?:any):void;
kill(key?:any):void
locked:boolean
tryLock(key:any):Promise<any>
}
}
JTITaskLocker --接口
module com
{
export interface JTITaskLocker extends JTILocker
{
signal:Promise<any>;
}
}
来测试一下代码:
let locker:c.JTLocker = new c.JTLocker();
let state:string = "normal ———————— "
async function testLocker()
{
for (let i:number = 0; i < 10; i++)
{
if (i == 3)
{
console.log("locked!------- ")
await locker.lock(); //当i等于3时,使用锁,暂停FOR循环(注意只调用了一次await locker.lock())
//当释放该Locker时,for循环后的7次将会继续执行
}
console.log(state + "test locker: " + i)
}
}
//2秒钟释放锁
setTimeout(() =>
{
state = "release ————————"
locker.unlocker();//解锁
locker.release();//释放锁,当调用release()时,下次使用locker.lock(),代码将重新被挂起,
}, 2000);
testLocker();
输出得下
[INFO] :22:16:17 >>>> normal ———————— test locker: 0
[INFO] :22:16:17 >>>> normal ———————— test locker: 1
[INFO] :22:16:17 >>>> normal ———————— test locker: 2
[INFO] :22:16:17 >>>> locked!-------
[INFO] :22:16:19 >>>> release ————————test locker: 3
[INFO] :22:16:19 >>>> release ————————test locker: 4
[INFO] :22:16:19 >>>> release ————————test locker: 5
[INFO] :22:16:19 >>>> release ————————test locker: 6
[INFO] :22:16:19 >>>> release ————————test locker: 7
[INFO] :22:16:19 >>>> release ————————test locker: 8
[INFO] :22:16:19 >>>> release ————————test locker: 9
let locker:c.JTLocker = new c.JTLocker();
let state:string = "normal ———————— "
// let lock:Promise<any> = locker.lock();
async function testLocker()
{
try
{
for (let i:number = 0; i < 10; i++)
{
// await lock;
info(" before lock" + i)
await locker.lock();
info(state + "test locker: " + i);
}
}
finally
{
locker.release();//等循环体结束,再释放锁
info("the loacker already release!")
}
}
//2秒钟释放锁
setTimeout(() =>
{
state = "release ————————"
locker.unlock();//先解锁
}, 2000);
testLocker();
可以测试看看效果