// 安卓手机 Android 和Rhino1.7.13 和ES5 JavaScript环境
// Android 环境 Rhinoceros 引擎与 JavaScript 的多线程示例
{
// 使用全局变量控制线程状态
var shouldStop = false;
// 创建一个 Java 的 Thread 对象
var runnable = new java.lang.Runnable({
run: function() {
var count = 0;
while (!shouldStop) {
try {
java.lang.Thread.sleep(1000); // 暂停 1 秒
// 检查中断状态
if (java.lang.Thread.currentThread().isInterrupted() || shouldStop) {
printl("子线程检测到中断信号");
break;
}
count++;
printl("子线程: " + count + " - " + new Date().toLocaleString());
} catch (e) {
printl("子线程捕获到异常: " + e);
// 在Rhino中,InterruptedException可能不会正确识别,所以使用全局变量
if (shouldStop) {
break;
}
}
}
printl("子线程正常退出");
}
});
var thread = new java.lang.Thread(runnable);
// 启动线程
thread.start();
printl("子线程已启动");
var t = 0;
try {
while (t < 5) {
try {
java.lang.Thread.sleep(1000); // 主线程暂停 1 秒
t = t + 1;
printl("主线程计数: " + t);
} catch (e) {
printl("主线程捕获到异常: " + e);
}
}
printl("停止子线程...");
// 设置全局停止标志
shouldStop = true;
// 同时使用Java的中断机制
thread.interrupt();
if (thread.isAlive()) {
printl("等待子线程结束...");
try {
// 最多等待3秒
thread.join(3000);
// 如果线程仍然活着,尝试再次中断
if (thread.isAlive()) {
printl("子线程未能在规定时间内结束,强制停止");
// 在某些环境中可能需要其他方式停止线程
// 这里我们已经尽力了,因为JavaScript不能真正"杀死"Java线程
}
} catch (e) {
printl("等待子线程时发生错误: " + e);
}
}
} catch (e) {
printl("主线程发生异常: " + e);
}
printl("程序结束!");
}
shouldStop
变量封装在闭包中,避免全局变量污染stop()
和isRunning()
方法来控制线程状态safeSleep()
函数,替代直接调用Thread.sleep()
sleep()
InterruptedException
来控制流程这个版本的代码应该能够避免那些【错误】 #0
提示,因为:
sleep()
间隔(100毫秒)sleep()
被中断,我们也能优雅地处理而不会导致错误日志sleep()
这种方法在Java与JavaScript混合环境中是一种常见的最佳实践,特别是当处理线程和延时时。
欢迎光临 信息发布软件,b2b软件,广告发布软件 (http://postbbs.com/) | Powered by Discuz! X3.2 |