Java 在android中使用线程是否不安全?

Java 在android中使用线程是否不安全?,java,android,Java,Android,我使用一个服务来启动一个线程,在这个线程中,我在这个线程中编写了一个while循环(我设置了一个标志,while标志为true,线程运行,如果标志为false,那么线程将不做任何事情,因此手动停止线程)。当我调试代码时,我经常注意到线程已结束,但服务仍在运行。它是由安卓系统回收的吗 如何防止线程被回收 =======编辑======= “线程是否会在结束前由系统自动清理”-表示线程在不应该被终止时被终止。不清楚您的代码在做什么,甚至不清楚您认为应该发生什么。但是有一件事我们可以马上解决 Java

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

如何防止线程被回收

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


“线程是否会在结束前由系统自动清理”-表示线程在不应该被终止时被终止。

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

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


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

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

()

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

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

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


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

这对我来说没有多大意义。也许你应该包括一些代码来说明你在做什么。对一些人来说,回收意味着“垃圾收集”——这可能就是他所说的。。“线程会在结束之前被系统自动清理掉吗”-所以他的问题是他的线程在不应该被删除的时候被杀死了,这对某些人来说意味着“垃圾收集”-这可能就是他所说的。。“线程将被系统自动清理”回收意味着“垃圾收集”。代码不在此计算机中。我先试试@RobertMaysJr的方法。如果它不工作,我将显示代码。谢谢你基于上下文的任何想法:-)我明白为什么@StephenC认为这可能是“重用”线程了。。。我想这一切都取决于你如何回收(新的路边皮卡,你把它扔到不同的垃圾桶里,而不是简单地自己再利用旧的学校方法);-)@westlinkin-1)GC不是您问题的原因;请参阅我的更新答案2)如果您使用传统的Java术语,将会有所帮助。3) Java中的回收(在存储管理意义上)实际上意味着将对象放入对象池中,以防止其被垃圾收集。(事实上,用线程来做这件事是值得的,尽管它改变了你使用它们的方式。)@StephenC英语不是我的母语,我用中文学习Java和Android。很抱歉把你弄糊涂了。:)我稍后再试。也许这就是原因。我所说的回收是指“垃圾收集”。注意:并不是垃圾收集器在做这件事!