android - 停止/销毁线程

标签 android multithreading service

我有一个像这样启动 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();
}

但它仍然不起作用,线程继续运行。有帮助吗?

最佳答案

线程 destroystop 方法本质上容易死锁且不安全。它们的存在也给人一种错觉,即当其他线程告诉它时,可能有某种方法可以立即停止另一个线程。

我理解你的想法,从你的角度来看,它们是一个主线程,当这个线程有一段时间没有收到它的工作线程的响应时,你想杀死它并重新启动它,不关心它在做什么。但不推荐使用这些方法的原因是您应该关心线程在做什么。很多。

如果线程有一个你需要稍后使用的变量的锁怎么办?如果一个线程打开了一个文件句柄怎么办?在所有这些情况下,以及更多情况下,简单地在当前操作中停止线程会使事情变得一团糟——很可能您的应用程序会进一步崩溃。

因此,为了使线程可中断、可取消或可停止,它必须自行管理。如果一个线程或操作无法让自己被中断,那么你不能中断它 - 假设这样做是不安全的。

如果你的runnable是字面意思

public void run() {
   doSomething();
}

那么就没有办法打断它了。人们希望如果 doSomething 是一个长操作,那么可能有一种方法可以通过类似的方式与它进行增量交互

public void run() {
   while (running) {
       MyParser.parseNext();
   }
}

或者能够通过引用传递一个变量来指示线程是否被中断,并且希望该方法会在合适的位置中断自己。

记住 blocking 操作是阻塞的。没有办法解决这个问题,你不能中途取消它。

关于android - 停止/销毁线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5660097/

相关文章:

python - 修复多处理进程超时时间

c# - 如何在 TcpClient 中正确使用 TPL?

android - 中国Android设备杀死后台服务

从 Windows 迁移到 Linux 后,Android Studio 项目中突然缺少 AndroidManifest.xml 文件?

java - 如何在android中以编程方式删除 ImageView 周围的填充

java - 同步run()方法

java - 如何创建持久的 Android 服务

java - Android 存储和检索数据列表的最佳方法

java - 无法在 Android 10 中创建目录

Android 服务 - BindService 与 startService 一起使用时出现问题