我使用了一个服务启动了一个线程,在这个线程中,我写了一个while循环(我设置了一个标志,while标志为真,线程运行,如果标志为假,那么线程不会做任何事情,因此停止手动线程)在这个线程中。当我调试我的代码时,我经常注意到线程已经结束,但服务仍在运行。是android系统回收的吗?
如何防止我的线程被回收?
====== 编辑 =======
“将在结束之前由系统自动清理线程” - 表示线程在不应该被杀死时被杀死
您是否在循环中调用 Thread.yield() 以允许系统执行其他操作?如果不是——那么 android 可能会因为消耗 100% CPU 使用率而杀死线程——如果它是一个简单的循环,堆栈跟踪不会改变,所以它会让你的脚本挂起
http://developer.android.com/reference/java/lang/Thread.html#yield ()
Yield() 告诉线程执行器它应该在返回到您的线程之前停止并运行其他线程,没有它您的循环将窃取其他应用程序的资源
如果你确定你的旗帜在一定时间内不会改变,你也可以睡觉
编辑 - 背景- 这是 android 检测挂起线程的方式 - 如果一个线程占用了 100% 的 CPU,那么它将堆栈跟踪转储到文件,等待一小段时间,然后转储另一个堆栈跟踪 - 如果两者匹配它假设代码已经停止运行,并且会为某个活动发出 ANR“xx 没有响应”对话框,或者,如果它是一个服务,它会简单地杀死它并自动重新启动它。
通过让步,您可以防止它消耗 100%,因此它永远不会尝试这样做。
不清楚你的代码在做什么,甚至你认为应该发生什么都不清楚。然而,有一件事我们可以马上弄清楚。
Java(和 Android)中的线程不会“回收”。一旦 Thread 的run()
方法结束(通过返回,或通过允许某些异常传播),它将永远不会重新启动。永远不会。
此外,线程仍在运行时不会被垃圾收集。垃圾收集不能导致线程结束。