我阅读了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;
答案 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()。