0

我使用了一个服务启动了一个线程,在这个线程中,我写了一个while循环(我设置了一个标志,while标志为真,线程运行,如果标志为假,那么线程不会做任何事情,因此停止手动线程)在这个线程中。当我调试我的代码时,我经常注意到线程已经结束,但服务仍在运行。是android系统回收的吗?

如何防止我的线程被回收?

====== 编辑 =======

“将在结束之前由系统自动清理线程” - 表示线程在不应该被杀死时被杀死

4

2 回答 2

1

您是否在循环中调用 Thread.yield() 以允许系统执行其他操作?如果不是——那么 android 可能会因为消耗 100% CPU 使用率而杀死线程——如果它是一个简单的循环,堆栈跟踪不会改变,所以它会让你的脚本挂起

http://developer.android.com/reference/java/lang/Thread.html#yield ()

Yield() 告诉线程执行器它应该在返回到您的线程之前停止并运行其他线程,没有它您的循环将窃取其他应用程序的资源

如果你确定你的旗帜在一定时间内不会改变,你也可以睡觉

编辑 - 背景- 这是 android 检测挂起线程的方式 - 如果一个线程占用了 100% 的 CPU,那么它将堆栈跟踪转储到文件,等待一小段时间,然后转储另一个堆栈跟踪 - 如果两者匹配它假设代码已经停止运行,并且会为某个活动发出 ANR“xx 没有响应”对话框,或者,如果它是一个服务,它会简单地杀死它并自动重新启动它。

通过让步,您可以防止它消耗 100%,因此它永远不会尝试这样做。

于 2012-09-06T03:03:02.220 回答
0

不清楚你的代码在做什么,甚至你认为应该发生什么都不清楚。然而,有一件事我们可以马上弄清楚。

Java(和 Android)中的线程不会“回收”。一旦 Thread 的run()方法结束(通过返回,或通过允许某些异常传播),它将永远不会重新启动。永远不会。

此外,线程仍在运行时不会被垃圾收集。垃圾收集不能导致线程结束。

于 2012-09-06T03:02:40.383 回答