我在StackOverflow
中阅读了很多关于通过抛出InterruptedException
来打断线程的问题和答案。
但大多数答案只使用for
循环,并且不时检查线程是否被中断:Thread.currentThread().isInterrupted()
。
我的代码就像:
public class UploadVideoRunnable implements Runnable {
@Override
public void run() {
isUploaded = new uploadMedia(title, uri);
}
}
我应该如何/在哪里添加代码来检查线程是否被中断?
很抱歉,如果这是一个noob问题,但我已经搜索了很多谷歌并且没有找到答案。
由于
编辑:更新的代码,uploadMedia是一个类,不一个方法
答案 0 :(得分:2)
“中断”需要“合作”。
这意味着:你只能中断那些包含这种循环结构的调用:
while (notDone) { doSomething(); Thread.sleep(); }
或类似的东西。这意味着:您必须查看该方法uploadMedia()并查看是否允许此类更改。所以,你可以改为:
while (notDone) {
if(interrupted) {
notDone = false;
} else {
doSomething();
Thread.sleep();
}
}
当然,上面更像是“伪代码”;你必须填写详细信息。
或者,您可以查看ExecutorServices;因为有一些方法可以强制阻止那些;见here
编辑:这不应该改变一件事。你看 - 你在那里叫一个方法;该类的构造函数。当然,该构造函数将调用其他方法;其中一个其他方法是运行较长时间进行上传工作的方法之一。最后:请注意中断也可能是
if (externalThingy.hasBeenCancelled()) {
含义:您可能需要添加其他参数到您的班级; Uploader类可以通过某种方式查询它是否应该停止执行当前正在执行的操作!
答案 1 :(得分:1)
在Android中,您不能从外部中断/取消执行线程(Bionic甚至不实现pthread_cancel()
)。即任何线程必须自行决定它是否应终止(通过从run()
返回)或继续执行。通知某个线程应该尽快终止的唯一方法 - 使用interrupt()
/ isInterrupted()
对。应终止的线程应定期检查是否有人中断了它。因此,您必须将您的工作分成小块并在它们之间进行测试。如果你无法拆分它 - 你无所事事,只能等到那个工作完成。