Ich verstehe die Idee hinter einem Executor, aber der Parameter r
verwirrt mich. Ich benutzte:
um tiefer zu graben und das Ergebnis ist:
%Vor% r
wird als Parameter an den Objektkonstruktor Thread
übergeben.
r
, der angibt, dass das übergebene Objekt ein ThreadPoolExecutor
? ThreadPoolExecutor
als Parameter passierbar, wenn Runnable
nicht wie vom by Thread's
-Konstruktor erforderlich implementiert wird? Wenn jemand mir auch eine Nicht-Lambda-Version des Codes liefern könnte, wäre das für mein Verständnis von großem Nutzen.
newSingleThreadExecutor
verwendet eine ThreadFactory als Argument. ThreadFactory
definiert eine einzelne Methode newThread
, die benötigt wird Ein Runnable als Argument und gibt einen Thread zurück.
Das Lambda könnte für Sie mehr Sinn ergeben, wenn wir explizit den Typ von r
angeben:
Nun ist es offensichtlich, dass dies eine Definition für den Körper von newThread
ist.
Mit Ausnahme der Tatsache, dass das Lambda als Argument an eine Methode übergeben wird, die eine ThreadFactory akzeptiert, kann der Compiler daraus schließen, dass der Typ von r
Runnable sein muss. Daher kann es weggelassen werden.
Ohne den Lambda übersetzt dieser Code die folgende anonyme Klassendefinition und Instanziierung:
%Vor%Wie lautet der einfache Buchstabe
ist?r
, der angibt, dass das übergebene Objekt einThreadPoolExecutor
?
Der Typ von r
ist Runnable, weil der Zieltyp des Lambda-Ausdrucks seine einzelne Methode auf diese Weise definiert.
Das Objekt, das Sie sehen, ist tatsächlich ein ThreadPoolExecutor$Worker
, was eine private innere Klasse von ThreadPoolExecutor ist, die Runnable implementiert.
Wie ist%
ThreadPoolExecutor
als Parameter passierbar, wenn% ce_de% nicht wie vom Konstruktor byRunnable
benötigt implementiert wird?
Siehe oben ( Thread
ist ein Runnable).