|
AIWROK软件多线程协作示例代码解析
- // 创建线程对象
- var dataThread = new thread();
- var logThread = new thread();
- /**************** 数据生成线程 ****************/
- dataThread.runJsCode(function() {
- for(var i=1; i<=5; i++) {
- printl("生成数据:", i);
- java.lang.Thread.sleep(1000); // Rhino引擎专用休眠方法
- }
- }, "数据线程");
- /**************** 日志记录线程 ****************/
- logThread.runJsCode(function() {
- for(var j=1; j<=5; j++) {
- printl("记录日志:", new Date());
- java.lang.Thread.sleep(1500);
- }
- }, "日志线程");
- /**************** 主线程监控 ****************/
- var checkInterval = setInterval(function() {
- // 状态组合检测
- var status = "数据线程状态:" + (dataThread.isAlive() ? "运行中" : "已停止") +
- " | 日志线程状态:" + (logThread.isAlive() ? "运行中" : "已停止");
- printl(status);
-
- // 双线程完成检测
- if(!dataThread.isAlive() && !logThread.isAlive()) {
- clearInterval(checkInterval);
- printl("所有线程执行完成");
- }
- }, 500); // 每0.5秒检测一次
- /**************** 安全停止机制 ****************/
- setTimeout(function() {
- dataThread.stop(); // 强制终止数据线程
- logThread.stop(); // 强制终止日志线程
- printl("强制停止所有线程");
- }, 10000); // 10秒后执行
复制代码 详细说明- 使用new thread()创建两个独立线程对象
- dataThread用于数据处理,logThread用于日志记录
- 每个线程有独立的执行上下文和生命周期
- 通过runJsCode方法执行匿名函数
- 使用for循环生成1-5的序列数据
- java.lang.Thread.sleep(1000)实现1秒间隔(Rhino引擎特性)
- 线程命名为"数据线程"便于调试识别
- 使用独立的时间间隔(1.5秒)避免与数据线程同步
- 通过new Date()获取当前时间戳
- 线程命名"日志线程"增强可读性
- setInterval创建500ms的轮询检查
- 使用isAlive()实时获取线程状态
- 智能终止机制:当两个线程都完成时自动停止监控
- 状态信息格式化输出,便于观察执行过程
- setTimeout设置10秒超时保护
- 双重停止保障:stop()方法强制终止线程
- 防止线程意外卡死导致程序挂起
执行流程主线程启动 → 创建子线程 → 启动状态监控 → 数据线程生成数据 → 日志线程记录时间 ↑ ↓ ↓ 强制停止 ← 状态检查 → 自动停止
注意事项- 线程休眠必须使用java.lang.Thread.sleep(),不能直接用JavaScript的setTimeout
- printl输出可能产生线程竞争,实际使用建议添加锁机制
- stop()是强制终止,可能导致资源未释放,生产环境建议使用标志位终止
- Rhino引擎的线程精度约为50ms,时间间隔不要设置过小
- 线程名称在调试时显示,建议保持唯一性和描述性
|
|