2013-06-23 3 views
0

У меня возникла проблема с ThreadPoolExecutor.ThreadPoolExecutor - различия между методами submit и execute?

После написания код, я нашел способ submit() съест RuntimeException брошенную программой, но метод execute() будет повторно бросить RuntimeException`. Я хочу знать причину этого.

Недавно я прочитал исходный код ThreadPoolExecutor и знаю принцип пула потоков. Теперь я понимаю, как работает метод execute(), но я не мог понять, как выполняется метод submit(). Я только знаю, что метод submit() будет обернуть Runnable или Callable в FutureTask и вызовите execute() метод:

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

хорошее объяснение здесь 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. Вы должны увидеть метод run в этом классе FutureTask.

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

спасибо. Я найду ответ в методе runTask (Runnable runnable) ThreadPoolExecutor, вызывается runnable.run(), поэтому будет вызван метод запуска runnale или fufureTask. –

+0

Я объяснил вам разницу между submit и execute. Я думал, что это то, о чем вы просили, и о том, как едят исключение – Tala

Смежные вопросы