如何在不停止主线程的情况下停止Android应用程序中所有正在运行的工作线程?
这方面有什么例子吗?
答案 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)
这篇文章谈论了很多关于主题的内容,如果不回答您的问题,请阅读并重新发布
答案 2 :(得分:2)
,不提供停止线程的方法。
你只能interrupt
线程,但线程必须处于可以中断的状态,如sleep
,wait
等......
或者您可以使用一些技巧使线程抛出异常,例如:
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)