- 使用闭包控制线程状态:
- 将
shouldStop
变量封装在闭包中,避免全局变量污染 - 提供了
stop()
和isRunning()
方法来控制线程状态
- 自定义安全延时函数:
- 创建了
safeSleep()
函数,替代直接调用Thread.sleep()
- 这个函数使用系统时间来实现延时,而不是完全依赖可能被中断的
sleep()
- 即使被中断也能保证近似的延时效果
- 更健壮的线程控制:
- 线程控制逻辑更加清晰,使用专门的控制器对象
- 减少了异常处理的复杂性,提高了代码可读性
- 避免直接依赖中断异常:
- 新代码不再直接依赖捕获
InterruptedException
来控制流程 - 而是使用返回值和状态检查来确定下一步操作
这个版本的代码应该能够避免那些【错误】 #0
提示,因为:
- 我们使用了更短的
sleep()
间隔(100毫秒) - 即使
sleep()
被中断,我们也能优雅地处理而不会导致错误日志 - 我们使用系统时间来确保正确的延时,不完全依赖
sleep()
这种方法在Java与JavaScript混合环境中是一种常见的最佳实践,特别是当处理线程和延时时。
// 安卓手机 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("程序结束!");
}