복붙노트

[HADOOP] 메소드 cancel () 및 메소드 인터럽트 ()가 중복 작업을 수행하는지 여부

HADOOP

메소드 cancel () 및 메소드 인터럽트 ()가 중복 작업을 수행하는지 여부

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;

해결법

  1. ==============================

    1.그것들은 다른 추상화 레벨 (스레드보다 높은 추상화 레벨 인 작업)에서 작동하기 때문에 일반적으로 같은 일을하지 않습니다. 그러나이 경우 통화가 중복 된 것 같습니다.

    그것들은 다른 추상화 레벨 (스레드보다 높은 추상화 레벨 인 작업)에서 작동하기 때문에 일반적으로 같은 일을하지 않습니다. 그러나이 경우 통화가 중복 된 것 같습니다.

    FutureTask.cancel ()은 태스크에 더 이상 실행할 필요가 없으며 태스크가 현재 실행중인 스레드 (있는 경우)를 중단하려고 시도합니다.

    t.interrupt ()는 스레드 t를 중단하려고 시도합니다.

    이 경우 중복되는 것 같습니다. 작업이 여전히 실행 중이면 cancel (true)이 스레드를 중단해야합니다.이 경우 중복 인터럽트 () 호출이 필요하지 않습니다 (스레드에서 실행중인 코드가 한 번의 중단을 무시하지만 두 번의 인터럽트가 중단되지 않는 한) ).

    해당 시점에서 작업이 이미 완료된 경우 cancel () 및 interrupt ()는 효력이 없습니다.

  2. ==============================

    2.여기에 결론을 내리고 싶습니다. FutureTask.cancel ()의 인수로 true를 전달하면 interupt ()와 동일한 효과를 얻을 수 있습니다. 왜? cancel () 메소드의 src를 들여다 보자. cancel () 메소드가 메소드를 호출한다는 것을 알았습니다.

    여기에 결론을 내리고 싶습니다. FutureTask.cancel ()의 인수로 true를 전달하면 interupt ()와 동일한 효과를 얻을 수 있습니다. 왜? cancel () 메소드의 src를 들여다 보자. cancel () 메소드가 메소드를 호출한다는 것을 알았습니다.

    innerCancel(mayInterruptIfRunning);
    

    메소드 안에있을 때 : innerCancel (mayInterruptIfRunning) ;, 우리는 아래 지침을 가질 수 있습니다 :

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

    따라서 필자의 경우 cancel () 실제로 실제로 인터럽트 ()를 호출합니다.

  3. from https://stackoverflow.com/questions/7412491/whether-method-cancel-and-method-interrupt-do-the-duplicate-job by cc-by-sa and MIT license