Wie FutureTask asynchrone Berechnung ist

8
%Vor%

Wenn ich das in main mache, wird es einen neuen Thread erstellen und ihm eine Aufgabe für die asynchrone Berechnung übergeben.

Wenn Sie die FutureTask Dokumentation sehen, heißt es auch:

  

Eine auflösbare asynchrone Berechnung. Diese Klasse bietet eine Basis   Implementierung von Future mit Methoden zum Starten und Abbrechen eines   Berechnung, Abfrage, um festzustellen, ob die Berechnung abgeschlossen ist, und abrufen   das Ergebnis der Berechnung.

Wie FutureTask also ein asynchronous computation ist, erstellt es intern Thread und sendet die Aufgabe, die wir ihm zum Zeitpunkt der Instanziierung von FutureTask like:

gegeben haben %Vor%

Andernfalls kann es keine asynchrone Berechnung sein. Bitte geben Sie mir das Code-Snippet von FutureTask Quellcode , in dem die Aufgabe zum Threading übergeben wird, um eine asynchrone Berechnung durchzuführen. Danke.

Ich habe die Antwort bekommen. Es versucht im Grunde, die Aufgabe im selben Thread wie der Aufrufer auszuführen. Es ist ziemlich offensichtlich in dem gegebenen Code:

Wenn Sie futureTask.run() aufrufen, ruft sie nur sync.innerRun(); auf und sync ist die Instanz der inneren Klasse Sync . Dadurch wird nur call() für das Callable-Objekt im selben Thread aufgerufen.

%Vor%     
Trying 04.11.2013, 13:18
quelle

1 Antwort

7
  

So, wie FutureTask eine asynchrone Berechnung ist, erstellt es Thread intern und übermittelt die Aufgabe, die wir ihm zum Zeitpunkt der Instanziierung von FutureTask geben, wie:

FutureTask wurde nicht für die direkte Verwendung durch den Benutzer entwickelt. Es ist so konzipiert, dass es über die Schnittstelle ExecutorService und die Klassen, die es implementieren, verwendet werden kann. Es sind diese Klassen, die FutureTask verwenden und die Threads usw. abzweigen. Möglicherweise müssen Sie weitere Informationen zu wie man die ExecutorService Nebenläufigkeitsklassen verwendet .

Die Klasse ThreadPoolExecutor ist die Hauptkomponente, die die Verwaltung der Threads im Pool tatsächlich übernimmt. Normalerweise rufen Sie Executors.newCachedThreadPool() oder Executors.newFixedThreadPool(10) auf, um eine Instanz davon zu erhalten.

%Vor%

Aus akademischer Sicht erweitert TPE unter dem Deckblatt AbstractExecutorService und dort können Sie sehen, dass die Klasse FutureTask verwendet wird, um die Aufgaben im Thread-Pool zu verwalten:

%Vor%

Der Code innerhalb von TPE ist ziemlich kompliziert und es ist nicht einfach, ein "Snippet" zu zeigen, das die asynchronen Aufrufe durchführt. Das TPE sieht, ob es weitere Threads zum Pool hinzufügen muss. Übergibt es an eine Aufgabenwarteschlange, die es entweder ablehnen oder akzeptieren kann, und dann entfernen die Threads die Aufgabe und führen sie im Hintergrund aus.

    
Gray 04.11.2013, 13:20
quelle