我有一个扩展Thread类的类,并且实现了run方法。
public void run(){
while(!terminate){
if(paused){
Thread.yield();
}else{
accummulator++;
}
}
}
该线程是从onCreate方法产生的。
当我的UI被隐藏时(按下Home键时),我的onPause方法会将暂停标志设置为true并产生胎面。但是在DDMS中,我仍然看到线程的uTime累积,其状态为“running”。
所以我的问题是。什么是停止线程的正确方法,以免它耗尽CPU时间?
答案 0 :(得分:4)
在onPause之后保持线程运行实际上是不好的做法。原因是在onPause之后你的应用程序可能会在你无法知道的情况下随时丢失内存,因此你将无法自行清理。
正确的方法是停止线程onPause并在onResume上重新创建它。如果你需要状态,你可以使用Android的内置saveState方法或设置,或者以其中任何一种方式保存。
答案 1 :(得分:1)
即使你正在调用thread.yield(),你仍然在while()循环中,这可能每秒循环数千次,每次调用.yield()但是它循环出来的事实控制意味着它正在耗尽资源。如果您在其中放置Log.d
消息,您将看到我的意思。
我建议使用Thread.sleep()
代替Thread.yield()
。原因是,当线程处于休眠状态时,它会被放弃。再加上睡眠,您可以获得减慢while()
速度而不会耗尽资源的额外好处。睡眠间隔500毫秒就足够了=)
答案 2 :(得分:0)
您的paused
变量最有可能是本地线程缓存的。这是因为它只是在循环中被读取而不是被改变。所以发生的事情是编译器/解释器/抖动只通过读取一次变量然后只执行else
分支来优化。您需要将该字段标记为volatile
,以便在循环中每次迭代时读取pause
变量。查看volatile
关键字的documentation。这是some info about threading和some info about synchronization and concurrency。