java - 方法 cancel() 和方法 interrupt() 是否做重复工作?

标签 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;

最佳答案

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

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

t.interrupt()试图中断 Thread t

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

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

关于java - 方法 cancel() 和方法 interrupt() 是否做重复工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7412491/

相关文章:

java - 在 Java Spring 中从文件中读取属性

hadoop - Hive 查询生成管理不善的登台目录

elasticsearch - Nutch和Elasticsearch集成

solr - Nutch 与 Solr

Java 单元测试 - 如何使用 mockito 答案对异步方法(使用回调)进行单元测试

java - 从另一个数组类调用方法

java - 将没有特定标准结构的 JSON 解析为 Map 或 Java 对象

java - 如何在Hadoop上模拟运行一些服务器?

java - Hadoop Library导入但无法在File System中设置 "get"方法

search - 如何构建搜索引擎? (2013 更新)