2016-07-13 21 views
5

Właśnie wpadł do kodu:Kiedy używać Guava sameThreadExecutor

ExecutorService executorService = MoreExecutors.sameThreadExecutor(); 

for (int i = 0; i < 10; i++) { 
    executorService.submit(new Callable<Void>() { 
    @Override 
    public Void call() throws Exception { 
     try { 
     Do some work here... 
     return null; 
     } catch (final Exception e) { 
     throw e; 
     } finally { 
     // 
     } 
    } 
    }); 
} 

Wszelkie różnice między tym i fragmentem kodu poniżej? Jeśli rozumiem to poprawnie, ten samThreadExecutor używa tego samego wątku, który wywołuje submit(), co oznacza, że ​​wszystkie te 10 "zadań" są uruchamiane jeden po drugim w głównym wątku.

for (int i = 0; i < 10; i++) { 
     try { 
     Do some work here... 
     } catch (final Exception e) { 
     throw e; 
     } finally { 
     // 
     } 
} 

Dzięki!

+3

To samo. Typowym przypadkiem użycia jest testowanie jednostek, w którym nie ma potrzeby wykonywania złożonych procedur asynchronicznych. –

Odpowiedz

5

Najpierw MoreExecutors#sameThreadExecutor jest przestarzała:

przestarzała. Użyj directExecutor(), jeśli potrzebujesz tylko Executor i newDirectExecutorService(), jeśli potrzebujesz ListeningExecutorService. Metoda ta zostanie usunięta w sierpniu 2016 roku

Więc pytanie brzmi: kiedy musisz MoreExecutors#directExecutor lub MoreExecutors#newDirectExecutorService (różnica między tymi dwoma wspomniano powyżej - ListeningExecutorService jest rozszerzenie guawy dla ListenableFuture s). Odpowiedzi są:

  • stosowanie go, gdy trzeba Executor/ExecutorService (. Ex Twój interfejs jest wymagana) i nie chce współbieżności ale raczej uruchomić wielowątkowe kod synchronicznie
  • (implikowane przez wyżej) używać go w testach na przewidywalne wyniki
  • kiedy tylko chcesz zaimplementować prosty ExecutorService jak newDirectExecutorService przez siebie, ale nie chce wyważać otwartych drzwi (patrz its source code)
  • jeśli używasz ListenableFuture##addCallback(ListenableFuture, FutureCallback), newDirectExecutorService jest używany domyślnie ("for use when the callback is fast and lightweight", także ja jest to "niebezpieczny wybór w niektórych przypadkach" (patrz javadoc)).
Powiązane problemy