我阅读了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()
都不会生效。