2011-09-14 2 views
2

나는 org.apache.nutch.parse.ParseUtil.runParser(Parser p, Content content)의 출처를 읽었습니다.메서드 cancel() 및 메서드 interrupt()가 중복 작업을 수행하는지 여부?

명령 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

다른 추상화 수준 (스레드보다 추상화 수준이 높은 작업)에서 작동하므로 일반적으로 동일한 작업을 수행하지 않습니다. 그러나이 경우 호출은 중복되는 것처럼 보입니다.

FutureTask.cancel()

는 더 이상 (있는 경우) 작업이 현재 실행되고있는 Thread을 중단하려고합니다 ( true가 인수로 전달되는 경우) 실행해야하는 작업을 알려줍니다.

t.interrupt()Threadt을 방해하려고 시도합니다.

이 경우 중복되는 것 같습니다. 경우 Task 여전히 스레드에서 실행되는 코드는 어떻게 든 중단을 무시하지만 인터럽트에 중단하지 않는 한 cancel(true)는 (중복 interrupt() 호출이 불필요한 경우에 스레드를 중단해야 다음, 실행 이는 거의 없습니다.)

작업이 이미 완료된 경우 cancel()interrupt()은 효과가 없습니다.

0

여기에 결론을 내리고 싶습니다. FutureTask.cancel()의 인수로 true를 전달하면 interupt()와 동일한 효과를 얻을 수 있습니다. 왜? cancel() 메소드의 src를 들여다 보겠습니다. 방법 내부 때

innerCancel(mayInterruptIfRunning); 

: innerCancel(mayInterruptIfRunning);, 우리가 아래 지침 가질 수

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

그래서, 내 경우, 취소를 ( 우리는 취소() 메소드는 메소드를 호출 것을 얻었다) 실제로 인터럽트() 실제로 호출합니다.