如何中断此runnable

时间:2016-09-14 13:48:58

标签: java multithreading runnable

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

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

我的代码就像:

   public class UploadVideoRunnable implements Runnable {

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

我应该如何/在哪里添加代码来检查线程是否被中断?

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

由于

编辑:更新的代码,uploadMedia是一个类,一个方法

2 个答案:

答案 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()对。应终止的线程应定期检查是否有人中断了它。因此,您必须将您的工作分成小块并在它们之间进行测试。如果你无法拆分它 - 你无所事事,只能等到那个工作完成。