android线程管理onPause

时间:2010-06-16 16:19:36

标签: android multithreading

我有一个扩展Thread类的类,并且实现了run方法。

public void run(){
    while(!terminate){
        if(paused){
            Thread.yield();
        }else{
            accummulator++;
        }
    }
}

该线程是从onCreate方法产生的。

当我的UI被隐藏时(按下Home键时),我的onPause方法会将暂停标志设置为true并产生胎面。但是在DDMS中,我仍然看到线程的uTime累积,其状态为“running”。

所以我的问题是。什么是停止线程的正确方法,以免它耗尽CPU时间?

3 个答案:

答案 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 threadingsome info about synchronization and concurrency