2013-06-23 74 views
0

我遇到了一個關於ThreadPoolExecutor的問題。ThreadPoolExecutor - 提交和執行方法之間的區別?

寫了一些代碼後,我發現submit()方法會吃掉程序拋出的RuntimeException,但​​方法會重新拋出RuntimeException。我想知道這個的原因。

我最近讀了ThreadPoolExecutor的源代碼,知道線程池的原理。 現在我明白​​方法是如何執行的,但我無法理解submit()方法是如何執行的。我只知道submit()方法將包裹在FutureTaskRunnableCallable並調用​​方法:

public Future submit(Runnable runnable) 
{ 
    if(runnable == null) 
    { 
     throw new NullPointerException(); 
    } else 
    { 
     RunnableFuture runnablefuture = newTaskFor(runnable, null); 
     execute(runnablefuture); 
     return runnablefuture; 
    } 
} 

所以,我的問題是:如何ThreadPoolExecutor執行FutureTask和爲什麼吃了RuntimeException

+3

的get方法一個很好的解釋是這裏http://stackoverflow.com/questions/3929342/choose-between-executorservices-submit-and-executorservices-execute – Tala

+0

我知道submit()方法會將異常綁定到Future,但在閱讀ThreadPoolExecutor的源代碼之後,我沒有找到它所做的地方?所以我想知道submit()方法如何將異常綁定到Future? –

+0

回答說明 – Tala

回答

0

如果你看看newTaskFor方法,你會發現RunnableFuture實際上是java.util.concurrent.FutureTask的實例。您應該在此FutureTask類中看到run方法。

public void run() { 
    sync.innerRun(); 
} 

這裏是innerRun方法:

void innerRun() { 
     if (!compareAndSetState(READY, RUNNING)) 
      return; 

     runner = Thread.currentThread(); 
     if (getState() == RUNNING) { // recheck after setting thread 
      V result; 
      try { 
       result = callable.call(); 
      } catch (Throwable ex) { 
       setException(ex); 
       return; 
      } 
      set(result); 
     } else { 
      releaseShared(0); // cancel 
     } 
    } 

異常被捕獲並設置任務。它會被拋出包裹成爲ExecutionException當你調用FutureTask

public V get() throws InterruptedException, ExecutionException { 
    return sync.innerGet(); 
} 
+0

謝謝。我找到了答案,在ThreadPoolExecutor的runTask(Runnable runnable)方法中,runnable.run()將被調用,因此將調用runnale或fufureTask的run方法。 –

+0

我向你解釋了提交和執行之間的區別。我認爲這就是你要求的以及如何吃掉異常 – Tala

相關問題