【问题标题】:whether method cancel() and method interrupt() do the duplicate job?方法 cancel() 和方法 interrupt() 是否重复工作?
【发布时间】:2011-09-14 07:05:29
【问题描述】:

我看了org.apache.nutch.parse.ParseUtil.runParser(Parser p, Content content)的出处。

这两个方法调用是否做同样的事情:

指令1:

t.interrupt();

指令2:

task.cancel(true);

org.apache.nutch.parse.ParseUtil.runParser(Parser p, Content content)的来源是:

ParseCallable pc = new ParseCallable(p, content);
FutureTask<ParseResult> task = new FutureTask<ParseResult>(pc);
ParseResult res = null;
Thread t = new Thread(task);
t.start();
try {
  res = task.get(MAX_PARSE_TIME, TimeUnit.SECONDS);
} catch (TimeoutException e) {
  LOG.warn("TIMEOUT parsing " + content.getUrl() + " with " + p);
} catch (Exception e) {
  task.cancel(true);
  res = null;
  t.interrupt();
} finally {
  t = null;
  pc = null;
}
return res;

【问题讨论】:

    标签: java hadoop nutch


    【解决方案1】:

    它们通常不会做同样的事情,因为它们作用于不同的抽象级别(任务是比线程更高的抽象级别)。然而,在这种情况下,调用似乎是多余的。

    FutureTask.cancel() 告诉任务它不再需要运行,并且(如果 true 作为参数传递)将尝试中断当前正在运行任务的 Thread(如果有)。

    t.interrupt() 尝试中断Thread t

    在这种情况下,它似乎是多余的。 如果Task 仍在运行,那么cancel(true) 应该中断线程,在这种情况下重复的interrupt() 调用是不必要的(除非在线程以某种方式忽略了一个中断,但在两个中断时停止,这不太可能)。

    如果此时任务已经完成,那么cancel()interrupt() 都将不起作用。

    【讨论】:

      【解决方案2】:

      在这里,我想总结一下: 当我们将 true 作为 FutureTask.cancel() 的参数传递时,我们可以获得与 interupt() 相同的效果。 为什么? 让我们看看 cancel() 方法的 src。 我们知道 cancel() 方法调用了该方法:

      innerCancel(mayInterruptIfRunning);
      

      在方法内部:innerCancel(mayInterruptIfRunning);,我们可以得到如下指令:

      if (mayInterruptIfRunning) {
                      Thread r = runner;
                      if (r != null)
                          r.interrupt();
                  }
      

      所以,就我而言,cancel() 实际上确实调用了 interrupt()。

      【讨论】:

        猜你喜欢
        • 2015-07-06
        • 2015-04-25
        • 2013-10-01
        • 1970-01-01
        • 2014-12-08
        • 1970-01-01
        • 2016-03-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多