2016-07-31 32 views
0

Laufen die Threads im Executor-Service parallel, und wird die Zeit nicht aufgeteilt, wenn eine Aufgabe an sie übergeben wird? Wenn sie nicht parallel laufen, was nutzt dann der Executor Service?Verwendung des Executor-Service

+0

Im Allgemeinen können ALLE Threads in Java zeitlich aufgeteilt werden. Wenn ein Thread blockiert ist (etwa bei IO), kann ein anderer Thread an seine Stelle treten. Eine CPU mit 4 Kernen kann 4 Prozesse ausführen, aber es können 100 Threads gleichzeitig ausgeführt werden, da sie durch IO oder Time Slicing ausgelagert werden. – markspace

+1

Hinweis: 'ExecutorService' ist ein _interface_, keine Implementierung. Wenn Sie nur wüssten, dass etwas ein ExecutorService ist, wissen Sie nicht, wie viele Threads (falls vorhanden) es verwendet hat oder wie sie geplant wurden. In den gebräuchlichsten Implementierungen jedoch, wenn Sie keine benutzerdefinierte 'ThreadFactory' bereitstellen, gibt es keinen Grund zu der Annahme, dass die Threads anders als alle anderen Threads im Programm geplant wurden. –

Antwort

1

Eine ExecutorService ist einfach eine Abstraktion über die Durchführung von asynchronen Operationen. Es kümmert sich darum, eingehende Aufgaben zu verwalten und sie über die verfügbaren Threads zu verteilen.

Wie für die Threads selbst, hängt es von der Umgebung, i. e. die Maschine, os und jvm. Wenn Sie einen einzelnen Prozessor mit einem Kern haben oder wenn das Betriebssystem dies nicht unterstützt, werden Sie das nicht parallel tun. Auf modernen Maschinen werden Sie jedoch zu einem gewissen Grad die parallele Ausführung erleben. Denken Sie daran, dass selbst wenn Sie Threads manuell erstellen, es keine Garantie gibt, dass sie vom Betriebssystem parallel ausgeführt werden.

+0

Also, wenn wir normalerweise 3 Threads erstellen, dann werden sie nicht parallel laufen, aber wenn wir eine Aufgabe zum Executor Service mit 3 Threads schicken, dann werden diese 3 Threads die Aufgabe parallel ausführen, richtig? – Zephyr

+0

Nein, es gibt keine "Magie" für einen "ExecutorService", mit dem Aufgaben parallel ausgeführt werden. Die vorhandenen Implementierungen verwenden dieselben Threads, die Sie selbst erstellen können. Der Unterschied besteht darin, dass die Verwendung eines 'ExecutorService' einfacher ist als das Erstellen eigener Threads. – pablochan

+0

Ok, danke für die Antwort. Ich habe noch eine Frage, Fork und Join ist eine spezialisierte Version von Executor-Service, die es den Threads ermöglicht, die Aufgaben parallel auszuführen, richtig? – Zephyr

0

Der Executor-Dienst ist ein ausgeklügelter Thread-Pool und ermöglicht die Ausführung mehrerer unabhängiger Tasks im Hintergrund.

Wenn sie parallel verarbeitet werden oder nicht, hängt davon ab, wie viele CPU-Einheiten Sie in Ihrer Maschine haben, und die genaue Verwendung dieser CPU liegt außerhalb der Kontrolle des Programmierers.

1

Von Java-Dokumentation:

Ein Executor der Methoden bereitstellt Beendigung und Methoden zu verwalten, die eine Zukunft für die Verfolgung von Fortschritt einer oder mehrere asynchronen Aufgaben produzieren können. Im Allgemeinen

, ALLE Callables zu einem ExecutorService vorgelegt werden immer parallel zu dem Haupt-Thread ausgeführt werden. Wie für übermittelte Tasks in einer ExecutorService können sie parallel sein, abhängig davon, wie viele Threads für die Ausführung im Service angegeben sind.

Wenn Sie einen Testamentsvollstrecker Dienst verwenden, die nur 1 Thread hat, dann egal, wie viele Aufgaben, die Sie einreichen, wird nur eines zu einem bestimmten Zeitpunkt auf diesem Executor Service ausgeführt werden.

Wenn Sie einen Executor-Service haben, der 5 Threads verwendet, werden maximal 5 übergebene Tasks parallel ausgeführt.

Hier ist ein Beispielcode:

public class ExecutorServiceTest { 
public static ExecutorService service = Executors.newFixedThreadPool(5); 
public static void main(String[] args) throws Exception { 
    System.out.println("Submitting!"); 

    service.submit(new PrintCallable("Callable 1")); 
    service.submit(new PrintCallable("Callable 2")); 
    service.submit(new PrintCallable("Callable 3")); 
    service.submit(new PrintCallable("Callable 4")); 
    service.submit(new PrintCallable("Callable 5")); 

    service.shutdown(); 
    service.awaitTermination(10, TimeUnit.SECONDS); 

    System.out.println("Done!"); 
} 

private static class PrintCallable implements Callable<Void> { 

    private final String toPrint; 

    private PrintCallable(String toPrint) { 
     this.toPrint = toPrint; 
    } 

    @Override 
    public Void call() throws Exception { 
     for(int i=0; i<5; i++) { 
      Thread.sleep(100); 
      System.out.println(toPrint); 
     } 
     return null; 
    } 

} 

}

diesen Code ausführen, wird ein "Callable x" in einer Verwebung Weise drucken.

Hinweis: Ich bin mir sicher, dass dies schon einmal gefragt wurde, aber ich kann nichts finden, was dieser Frage sehr ähnlich ist.

+0

Also, wenn wir normalerweise 3 Threads erstellen, dann werden sie nicht parallel laufen, aber wenn wir eine Aufgabe zum Executor-Service mit 3 Threads senden, dann werden diese 3 Threads die Aufgabe parallel ausführen, richtig? – Zephyr

+0

Ja, verschiedene Threads werden parallel ausgeführt. Ob sie über ExecutorService laufen oder nicht, ist irrelevant. Wie die Threads verwaltet werden, hängt von Ihrer Arbeitsumgebung ab. Ich habe deine Diskussion mit @pablochan gelesen. Es sollte nichts mehr geben, was ich D hinzufügen kann: – Kree