如何中断这个runnable

How to interrupt this runnable

我在Whosebug中阅读了很多关于通过抛出InterruptedException来中断线程的问题和答案。

但是大多数答案都只使用了一个 for 循环,并且他们会不时地检查线程是否被中断:Thread.currentThread().isInterrupted().

我的代码是这样的:

   public class UploadVideoRunnable implements Runnable {

       @Override 
       public void run() {
          isUploaded = new uploadMedia(title, uri);
        }
    }

How/Where我应该添加代码来检查线程是否被中断吗?

抱歉,如果这是一个菜鸟问题,但我已经搜索了很多 google 并且没有找到答案。

谢谢

编辑:更新代码,uploadMedia 是一个 class 而 不是 一个方法

"Interrupting" 这里需要 "cooperation"。

这意味着:您只能中断包含此类循环结构的调用...:

while (notDone) { doSomething(); Thread.sleep(); }

或类似的东西。这意味着:您将不得不查看该方法 uploadMedia() 并查看是否允许进行此类更改。因此,您可以将其更改为:

while (notDone) { 
  if(interrupted) {
    notDone = false;
   } else {
   doSomething(); 
   Thread.sleep(); 
   }
}

当然,上面更像"pseudo-code";您必须填写详细信息。

或者,您可以查看 ExecutorServices;因为有一些方法可以强行阻止那些;见 here

编辑:这不应该改变任何事情。你看——你在那里调用了一个方法; class 的构造函数。可以肯定的是,该构造函数将调用 other 方法;其中一种 other 方法是 运行 较长时间来完成其上传工作的方法。

最后:请注意 interrupted 也可能类似于

if (externalThingy.hasBeenCancelled()) {

含义:您可能需要 添加 另一个参数到您的 class;上传者 class 可以通过某种方式查询以确定是否应该停止当前正在做的事情!

在 Android 中,您不能从外部中断/取消执行线程(Bionic 甚至没有实现 pthread_cancel())。 IE。任何线程都必须自行决定是应该终止(通过从 run() 返回)还是继续执行。通知某个线程它应该尽快终止的唯一方法是使用 interrupt() / isInterrupted() 对。应该终止的线程应该定期检查是否有人中断了它。因此,您必须将您的工作分成小块并在它们之间进行测试。如果您无法拆分它 - 您无事可做,只能等到该工作完成。