Ich kann die Variable "i" in der Methode run () nicht verwenden. Gibt es einen Weg, es zu tun?
%Vor% Das stimmt. Es ist eine Einschränkung der inneren Klassen von Java! Eine innere Klasse darf nicht auf eine Instanzvariable in einem umschließenden Bereich zugreifen, es sei denn, diese Variable wird als final
deklariert.
Sie müssen diesen Code also so implementieren ...
%Vor% Der Grund für diese Einschränkung besteht darin, zu vermeiden, dass Java closures implementiert. Da ii
endgültig ist, kann der Compiler das Obige implementieren, indem er eine Kopie des Wertes von ii
an die anonyme innere Klasse übergibt, wenn diese instanziiert wird. Dies wird in einer versteckten Variablen gespeichert ..., so dass es verwendet werden kann, nachdem der umschließende Methodenaufruf abgeschlossen ist.
Ohne diese Einschränkung müsste ein (hypothetischer) Java-Compiler ein Heap-Objekt erstellen, das die Variable i
enthält. (Oder zumindest, wenn es das Objekt nicht optimieren könnte ...) Genau darum geht es bei closures auf der Implementierungsebene.
Der andere Punkt, den Menschen manchmal übersehen, ist, dass dieser bestimmte Algorithmus falsch wäre, wenn Java Ihnen den Zugriff auf das nicht-endgültige i
ermöglicht. Warum? Weil zu dem Zeitpunkt, zu dem die Threads tatsächlich gestartet wurden, die äußere Schleife höchstwahrscheinlich beendet sein würde und die Threads alle i
mit dem Wert N
sehen würden. Das ist NICHT das, was Sie hier erreichen wollen.
UPDATE beginnend mit Java 8 muss die äußere Instanzvariable nur effektiv final sein.
Dies ist die Einschränkung der inneren Klasse von Java, da Java keine echten Sperren
unterstütztSehen Sie sich auch dieses Kann nicht auf eine nicht endgültige Variable innerhalb einer inneren Klasse verweisen, die in einer anderen Methode definiert wurde für Details.
Sie können so versuchen:
%Vor%Tags und Links java