如何在android应用程序中停止所有工作线程

时间:2012-03-14 09:39:15

标签: java android

如何在不停止主线程的情况下停止Android应用程序中所有正在运行的工作线程?

这方面有什么例子吗?

4 个答案:

答案 0 :(得分:3)

实际上线程有方法stop(),所以你可以遍历所有工作线程并在每个线程上调用这个方法。

问题是“在哪里获取工作线程列表?” 更好的解决方案是将此列表存储在应用程序级别的某个位置,即每次创建工作线程时都将其放入特殊列表。这是更好的解决方案,因为您和只有您知道该线程是“工作”线程。

但理论上,您甚至可以动态发现应用程序并检索线程。有静态方法Thread.enumerate(Thread[] threads)填充提供的数组。但是如何知道现在有多少线程在运行?使用Thread.activeCount()

Thread[] threads = new Thread[Thread.activeCount()];
Thread.enumerate(threads);
for (Thread t : threads) {
    if (isWorkerThread(t)) {
        t.stop();
    }
}

由您来识别您的工作线程。例如,您可以使用线程的名称或线程的堆栈跟踪。

但是,调用已弃用的方法stop()是犯罪行为。请参考此方法的javadoc来了解原因。

“正确”的方法是在应用层实现优雅的关闭机制。每个线程都应该检查一些标志,说明线程是否应该关闭,当flag为true时,只需从run()方法返回。在这种情况下,关闭工作线程非常简单:只需将此标志的值设置为true,线程将自行终止。这是“正确”的解决方案。

答案 1 :(得分:2)

这篇文章谈论了很多关于主题的内容,如果不回答您的问题,请阅读并重新发布

Stopping/Destroying a Thread

答案 2 :(得分:2)

java中的

,不提供停止线程的方法。

你只能interrupt线程,但线程必须处于可以中断的状态,如sleepwait等......

或者您可以使用一些技巧使线程抛出异常,例如:

  1.如果线程是连接网络,你要停止线程,你可以关闭网络连接,会抛出ioexception;

     

2.如果线程被读取文件,则可以关闭流以抛出ioexception;

     

3.如果线程正在查询数据库,则可以关闭数据库

所以它取决于你的线程工作。

答案 3 :(得分:0)

两种方法

使线程中断

 Thread.interrupt()

它可以解决问题吗?不,不是,只有在线程处于阻塞/等待状态时才会中断线程。调用thread.interrupted不会停止线程。那有什么帮助呢?您尝试运行的代码。检查诸如长期运行的网络操作,数据库操作之类的操作。这样可以中断大多数线程。

杀死该进程并重新启动

   Kill the app process and restart it from zygote (It might not be for all devs)