方法cancel()和方法interrupt()是否执行重复作业?

时间:2011-09-14 07:05:30

标签: java hadoop nutch

我阅读了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;

2 个答案:

答案 0 :(得分:0)

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

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

t.interrupt()尝试中断Thread t

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

如果此时任务已经完成,则cancel()interrupt()都没有效果。

答案 1 :(得分:0)

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

innerCancel(mayInterruptIfRunning);

在方法内innerCancel(mayInterruptIfRunning);时,我们可以提供以下说明:

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

所以,在我的情况下,cancel()实际上实际上调用了interrupt()。