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

最佳答案

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

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

t.interrupt() 尝试中断Thread t

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

如果此时任务已完成,则cancel()interrupt()都不会生效。

09-04 07:14
查看更多