在android中使用Thread是不安全的吗?

时间:2012-09-06 02:50:58

标签: java android

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

如何防止我的线程回收?

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

“系统会在它结束之前自动清理线程” - 意味着该线程在不应该被杀死时被杀死

2 个答案:

答案 0 :(得分:1)

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

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

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

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

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

通过屈服你可以防止它消耗100%所以它永远不会尝试这样做。

答案 1 :(得分:0)

目前还不清楚你的代码在做什么,甚至你认为应该发生什么。但是有一件事我们可以马上解决。

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

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