J'ai du code comme celui-ci:
class MyClass{ final ArrayList<Thread> list= new ArrayList<>(); for(int i=0;i<N;i++) new Thread(()->{ //more instructions... list.remove(this); }).start(); }
5 Réponses :
En tant que vous utilisez une expression Lambda, qui ne possède aucun Mais même si vous remplacez l'expression de la Lambda avec une sous-classe anonyme, comme ceci: p> this code> this code> ferait référence à la sous-classe anonyme de Ce code> fait référence à l'instance code> myClass code>.
ce contexte code> c'est propre. p>
runnable code>, et non à un fichier code> instance code>. p> p>
Ce mot clé referve à l'objet qui appelle la méthode. Dans ce cas mycass. Votre liste contient des threads. Votre code tente de supprimer cet objet (myClass) à partir d'une liste contenant des threads. p>
ce qui n'a pas de sens p>
Oui, je comprends le sentiment de l'avertissement, c'est pourquoi myClass est référé au lieu de fil, mais basé sur la réponse de @MC Emperor Ceci est dû à l'utilisation de l'expression de Lambda
Ce n'est pas à cause de Lambda, c'est parce que vous définissez la méthode de cette classe (myClass). Chaque fois que vous utilisez "ceci" dans un plan de classe, il fera référence à l'instance qui appelle la méthode. MC EMP souligne que l'expression de la Lamba ne change pas ce que "ceci" est de reposer.
J'ai eu une solution de contournement qui correspond à mon besoin: J'ai changé la liste afin qu'il contienne des objets code> exécubles code>, puis ce code> sera se référer à la classe exécutive. p> p>
Vous pouvez utiliser runnable pour éviter ce code> conflit de mots-clés. P>
Utilisation d'un Runnable code> à la place vous aidera à éviter les contextes emballés. P>
Votre fonction Lambda n'est pas membre de
thread code>; Il s'agit juste d'être transmis dans le constructeur de fil. Donc
ceci code> ne peut pas être votre objet de thread.