2016-07-13 17 views
5

verwenden, nur in einen Code wie folgt aus:Als ich lief 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 { 
     // 
     } 
    } 
    }); 
} 

Jede Differenz zwischen diesem und dem Codeausschnitt unten? Wenn ich es richtig verstehe, verwendet sameThreadExecutor denselben Thread, der submit() aufruft, was bedeutet, dass alle diese 10 "Jobs" nacheinander im Hauptthread ausgeführt werden.

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

Vielen Dank!

+3

Es ist das gleiche. Ein häufiger Anwendungsfall sind Unit-Test-Klassen, bei denen die Komplexität der asynchronen Ausführung nicht berücksichtigt werden soll. –

Antwort

5

Zuerst wird MoreExecutors#sameThreadExecutor veraltet:

Veraltete. Verwenden Sie directExecutor(), wenn Sie nur Executor und newDirectExecutorService() benötigen, wenn Sie eine ListeningExecutorService benötigen. Diese Methode wird 2016.

So Frage ist im August entfernt werden: wenn Sie brauchen MoreExecutors#directExecutor oder MoreExecutors#newDirectExecutorService (Differenz zwischen den beiden oben genannten ist - ListeningExecutorService ist Erweiterung des Guava für ListenableFuture s). Antworten sind:

  • Verwendung es, wenn Sie benötigen Executor/ExecutorService (. Ex Ihre Schnittstelle erforderlich ist) und nicht Gleichzeitigkeit wollen, sondern führen Sie Ihre Multi-Threaded-Code synchron
  • (implizierten oben) verwenden es in Tests für vorhersehbare Ergebnisse
  • wenn man sich wünschen kann einfach ExecutorService wie newDirectExecutorService selbst zu implementieren, aber wollen nicht das Rad neu zu erfinden (siehe its source code)
  • wenn Sie ListenableFuture##addCallback(ListenableFuture, FutureCallback) verwenden, wird newDirectExecutorService standardmäßig verwendet ("for use when the callback is fast and lightweight", auch ich Es ist in einigen Fällen "eine gefährliche Wahl" (siehe javadoc)).