我有一个像这样启动 Thread 和 Runnable 的服务。
t = new Thread(new Runnable() {
public void run() {
doSomething();
}
});
t.start();
线程的原因是执行异步任务doSomething()。现在让我们不必担心其他类 AsyncTask。我已经尝试过了,但它不适用于我的情况。编辑:我不能使用 AsyncTask 因为它只用于 UI 线程。这段代码必须在 Service 中运行,所以不,没有 AsyncTask :(
doSomething() 包含一些外部库,所以我遇到的问题是它可能会卡在其中一个命令上,而不返回任何值(因此甚至无法进行错误检查)
为了解决这个问题,我想在某个时间点销毁服务。
stopService(new Intent("net.MyService.intent));
这可以正常工作,并且可以在手机上轻松验证。但是,上面创建的 Thread 将继续运行,即使生成它的 Service 被销毁。
因此,我正在寻找插入服务的 onDestroy() 的正确命令,这将为我清理线程。
t.destroy();
t.stop();
都已贬值并导致应用程序崩溃。
我从某个地方获取了这段代码
@Override
public void onDestroy() {
Thread th = t;
t = null;
th.interrupt();
super.onDestroy();
}
但它仍然不起作用,线程继续运行。有帮助吗?
最佳答案
线程 destroy
和 stop
方法本质上容易死锁且不安全。它们的存在也给人一种错觉,即当其他线程告诉它时,可能有某种方法可以立即停止另一个线程。
我理解你的想法,从你的角度来看,它们是一个主线程,当这个线程有一段时间没有收到它的工作线程的响应时,你想杀死它并重新启动它,不关心它在做什么。但不推荐使用这些方法的原因是您应该关心线程在做什么。很多。
如果线程有一个你需要稍后使用的变量的锁怎么办?如果一个线程打开了一个文件句柄怎么办?在所有这些情况下,以及更多情况下,简单地在当前操作中停止线程会使事情变得一团糟——很可能您的应用程序会进一步崩溃。
因此,为了使线程可中断、可取消或可停止,它必须自行管理。如果一个线程或操作无法让自己被中断,那么你不能中断它 - 假设这样做是不安全的。
如果你的runnable是字面意思
public void run() {
doSomething();
}
那么就没有办法打断它了。人们希望如果 doSomething
是一个长操作,那么可能有一种方法可以通过类似的方式与它进行增量交互
public void run() {
while (running) {
MyParser.parseNext();
}
}
或者能够通过引用传递一个变量来指示线程是否被中断,并且希望该方法会在合适的位置中断自己。
记住 blocking
操作是阻塞的。没有办法解决这个问题,你不能中途取消它。
关于android - 停止/销毁线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5660097/