当前位置:首页 > 快手AAUTE多线程中的交通信号灯
多线程中的交通信号灯:thread.event
标准库中的 thread.event 用于创建线程事件对象,
该对象类似于多线程中的交通信号灯、实现红绿灯机制实现多线程之间的同步协作。
创建 thread.event 对象的代码如下:
源代码 [ AAuto ]
001 import thread.event;
002 var event = thread.event(\交通信号灯\
其中第一个参数指定一个唯一的名称、一般建议用快手工具里的GUID工具生成一个GUID以保证其唯一性。 不同线程、或不同进程中使用相同的名称就可以打开同一个事件对象( thread.event对象不但可以跨线程、也可以跨进程使用 )使用 event.conflict 属性可以判断其他线程或进程是否打开了该事件对象。
thread.event有三个构造参数,如下:
var event = thread.event(\事件唯一名称\,是否手动复原信号,初始状态)
参数2、参数3都是可选参数,默认都是false.
初始状态为false表示初始化为无信号状态, 如果手动复原信号为false表示自动复原信号,也就是每次放行线程以后自动重置为无信号状成。
如果把event比作交通信号灯,那么无信号状态类似红灯表示禁止通行,而有信号状态类似绿灯表示放行等待的线程,几个关键的函数:
源代码 [ AAuto ]
001 import thread.event;
002 var event = thread.event(\交通信号灯\
003
004 event.reset(); //重置为无线号状态、类似于切换为红灯
005 event.set();//切换为有线号状态、类似于切换为绿灯
006 event.wait(); //阻塞线程、并等待信号变为绿灯
007 //如果不是手动复原的事件对象、执行到这里会自动复原为无信号状态(绿灯)
源代码 [ AAuto ]
001 io.open()
002
003 thread.create(
004 function(){
005 import thread.event;
006 var event = thread.event(\交通信号灯\
007
008 event.wait();
009 io.print(\汽车1 过了\
010 }
011 )
012
013 thread.create(
014 function(){
015 import thread.event;
016 var event = thread.event(\交通信号灯\
017
018 event.wait();
019 io.print(\汽车2 过了\
020 }
021 )
022
023 thread.create(
024 function(){
025 import thread.event;
026 var event = thread.event(\交通信号灯\
027
028 event.wait();
029 io.print(\汽车3 过了\
030 }
031 )
032
033 //给一点时间让所有线程进入等待状态
034 sleep(100)
035
036 import thread.event;
037 var event = thread.event(\交通信号灯\
038 event.set(); //切换为绿灯
执行上面的代码以后,你会发现只有一部汽车过了(线程是并发执行的,所以可能是任意一部汽车先过),这是为什么呢?
thread.event的二个构造参数如果为false(默认就是这个值)那么创建的事件对象是自动复原信号的,当一个等待的线程被放行以后,该对象会立即自动切换为无信号状态( 用上面的示例来讲:就是绿灯放行一部车子就立即变为绿灯,一次只能过一部车子)
如果要一次放行所有等待的线程,那就要做如下修改,使事件对象使用手动复原机制,示例如下: 源代码 [ AAuto ]
001 import thread.event;
002 var event = thread.event(\交通信号灯22\手动复原*/)
003
004 thread.create(
005 function(){
006 import thread.event;
007 var event = thread.event(\交通信号灯22\
008
009 event.wait();
010 io.print(\汽车1 过了\
011 }
012 )
013
014 thread.create(
015 function(){
016 import thread.event;
017 var event = thread.event(\交通信号灯22\
018
019 event.wait();
020 io.print(\汽车2 过了\
021 }
022 )
023
024 thread.create(
025 function(){
026 import thread.event;
027 var event = thread.event(\交通信号灯22\
028
共分享92篇相关文档