Thread
Thread对象可以通过threading.Thread()、threading.getThread()、threading.mainThread()、threading.currentThread()创建或返回。
peekMessage
peekMessage()函数用于从线程接收消息。
peekMessage()
peekMessage(timeout)示例
并发线程向主线程发送消息。
javascript
function main() {
var t1 = threading.Thread(function() {
for (var i = 0; i < 10; i++) {
Log("thread1 postMessage():", i)
threading.mainThread().postMessage(i)
Sleep(500)
}
})
while (true) {
var msg = threading.currentThread().peekMessage()
Log("main peekMessage():", msg)
if (msg == 9) {
break
}
Sleep(1000)
}
t1.join()
}返回值
| 类型 | 描述 |
string / number / bool / object / array / any (系统支持的所有类型) |
|
参数
| 名称 | 类型 | 必填 | 描述 |
timeout | number | 否 | 参数 |
参考
备注
编写程序时需注意避免线程死锁问题。
postMessage
postMessage()函数用于向线程发送消息。
postMessage(msg)示例
-
在并发线程中发送消息,使用
eventLoop()接收消息通知。javascriptfunction main() { var t1 = threading.Thread(function() { for (var i = 0; i < 10; i++) { Log("thread1 postMessage():", i) threading.mainThread().postMessage(i) Sleep(500) } }) for (var i = 0; i < 10; i++) { var event = threading.mainThread().eventLoop() Log("main event:", event) Sleep(500) } t1.join() } -
支持发送函数。
javascriptfunction main() { threading.mainThread().postMessage(function(msg) { Log("func from mainThread, msg:", msg) }) threading.Thread(function() { var func = threading.mainThread().peekMessage() func("in " + threading.currentThread().name()) }).join() }
参数
| 名称 | 类型 | 必填 | 描述 |
msg | string / number / bool / object / array / function / any (系统支持的所有类型) | 是 | 参数 |
参考
备注
当线程的执行函数中调用postMessage()函数发送信号或数据时,会产生消息事件。可以使用eventLoop()函数接收消息通知。
join
join()函数用于等待线程退出并回收系统资源。
join()
join(timeout)示例
测试join()函数超时并输出返回值。
javascript
function main() {
var t1 = threading.Thread(function() {
Log("Hello thread1")
Sleep(5000)
})
var ret = t1.join(1000)
Log("ret:", ret) // ret: undefined
ret = t1.join()
Log("ret:", ret) // ret: {"id":1,"terminated":false,"elapsed":5003252000}
}返回值
| 类型 | 描述 |
|
|
参数
| 名称 | 类型 | 必填 | 描述 |
timeout | number | 否 |
|
参考
备注
join()函数超时时返回undefined。
terminate
terminate()函数用于强制终止线程,释放该线程占用的硬件资源。
terminate()示例
强制终止一个线程的执行。线程被强制终止后,日志中将不再输出该线程的内容。
javascript
function main() {
var t1 = threading.Thread(function() {
for (var i = 0; i < 10; i++) {
Log("thread1 i:", i)
Sleep(1000)
}
})
Sleep(3000)
t1.terminate()
Log("after t1.terminate()")
while (true) {
LogStatus(_D())
Sleep(1000)
}
}参考
备注
对于使用terminate()函数强制终止的线程,无法再使用join()函数等待其结束。
getData
getData()函数用于访问线程环境中记录的变量。数据在线程未执行join()函数(等待退出成功)且未执行terminate()函数(强制终止线程)的情况下有效。
getData()
getData(key)示例
在并发线程的环境中记录键名为count的值,然后在主线程中读取count的键值。
javascript
function main() {
var t1 = threading.Thread(function() {
for (var i = 0; i < 5; i++) {
threading.currentThread().setData("count", i)
Log(`setData("count"):`, i)
Sleep(1000)
}
})
for (var i = 0; i < 5; i++) {
var count = threading.getThread(t1.id()).getData("count")
Log(`getData("count"):`, count)
Sleep(1000)
}
t1.join()
}返回值
| 类型 | 描述 |
string / number / bool / object / array / any (系统支持的所有类型) |
|
参数
| 名称 | 类型 | 必填 | 描述 |
key | string | 是 |
|
参考
setData
setData()函数用于在线程环境中存储变量。
setData(key, value)示例
-
在并发线程中设置键值对,在主线程中读取该键值对。
javascriptfunction main() { var t1 = threading.Thread(function() { threading.currentThread().setData("data", 100) }) Sleep(1000) Log(`t1.getData("data"):`, t1.getData("data")) t1.join() } -
支持将函数作为键值传入。
javascriptfunction main() { threading.mainThread().setData("func2", function(p) { Log("func2 p:", p) }) var t1 = threading.Thread(function() { threading.currentThread().setData("func1", function(p) { Log("func1 p:", p) }) var func2 = threading.mainThread().getData("func2") func2("test2") }) Sleep(1000) var func1 = t1.getData("func1") func1("test1") t1.join() }
参数
| 名称 | 类型 | 必填 | 描述 |
key | string | 是 |
|
value | string / number / bool / object / array / function / any (系统支持的所有类型) | 是 |
|
参考
备注
数据在线程未执行join()函数(等待退出成功)且未执行terminate()函数(强制终止线程)的情况下有效。参数value的值必须是可序列化的变量。
id
id()函数用于返回当前多线程对象实例的threadId。
id()示例
创建一个并发线程,在主线程中输出该并发线程的threadId。
javascript
function main() {
var t1 = threading.Thread(function() {
threading.currentThread().setData("data", 100)
})
Log(`t1.id():`, t1.id())
t1.join()
}返回值
| 类型 | 描述 |
number |
|
参考
name
name()函数用于返回当前多线程对象实例的名称。
name()示例
创建一个并发运行的线程,在主线程中输出该并发线程的名称。
javascript
function main() {
var t1 = threading.Thread(function() {
threading.currentThread().setData("data", 100)
})
Log(`t1.name():`, t1.name()) // t1.name(): Thread-1
t1.join()
}返回值
| 类型 | 描述 |
string |
|
参考
eventLoop
eventLoop()函数用于监听线程接收到的事件。
eventLoop()
eventLoop(timeout)示例
并发执行3个线程,输出接收到的事件信息。超时或立即返回时输出空值。
javascript
function main() {
var t1 = threading.Thread(function() {
while (true) {
var eventMsg = threading.currentThread().eventLoop() // 阻塞等待
// 2024-11-14 10:14:18 thread1 eventMsg: {"Seq":1,"Event":"thread","ThreadId":0,"Index":1,"Queue":0,"Nano":1731550458699947000}
Log(_D(), "thread1 eventMsg:", eventMsg)
}
})
var t2 = threading.Thread(function() {
while (true) {
var eventMsg = threading.currentThread().eventLoop(-1) // 立即返回
Log(_D(), "thread2 eventMsg:", eventMsg)
Sleep(5000)
}
})
var t3 = threading.Thread(function() {
while (true) {
var eventMsg = threading.currentThread().eventLoop(3000) // 设置3秒超时
Log(_D(), "thread3 eventMsg:", eventMsg)
}
})
t1.postMessage("Hello ", t1.name())
t2.postMessage("Hello ", t2.name())
t3.postMessage("Hello ", t3.name())
t1.join()
t2.join()
t3.join()
}返回值
| 类型 | 描述 |
object / 空值 |
|
参数
| 名称 | 类型 | 必填 | 描述 |
timeout | number | 否 | 参数 |
参考
备注
eventLoop()函数的处理机制与全局函数EventLoop()一致。