2011-09-14 23 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()告訴它不再需要運行和(如果true作爲參數傳遞)將試圖打斷其上的任務當前正在運行的Thread(如果有的話)的任務。

t.interrupt()試圖中斷Threadt

在這種情況下,它似乎是多餘的。 如果Task仍在運行,那麼cancel(true)應該中斷線程,在這種情況下,重複interrupt()調用是不必要的(除非在線程中運行的代碼在某種程度上忽略一個中斷,但停止對中斷,這不太可能)。

如果該任務已經完成,那麼cancel()interrupt()都沒有效果。

0

在這裏,我想做一個結論:當我們傳遞FutureTask.cancel()的參數爲true時,我們可以得到與interupt()相同的效果: 。 爲什麼?我們來看看cancel()方法的src。 我們得到了cancel()方法調用方法:

innerCancel(mayInterruptIfRunning); 

當方法中:innerCancel(mayInterruptIfRunning);,我們可以有以下說明:

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

所以,在我的情況下,取消( )確實調用了interrupt()。