Java在类内创建的线程中使用此关键字
我有一些这样的代码:Java在类内创建的线程中使用此关键字,java,this,Java,This,我有一些这样的代码: class MyClass{ final ArrayList<Thread> list= new ArrayList<>(); for(int i=0;i<N;i++) new Thread(()->{ //more instructions... list.remove(this); }).start(); } new Thread(new
class MyClass{
final ArrayList<Thread> list= new ArrayList<>();
for(int i=0;i<N;i++)
new Thread(()->{
//more instructions...
list.remove(this);
}).start();
}
new Thread(new Runnable() {
public void run() {
list.remove (this);
}
})
class-MyClass{
最终ArrayList=新ArrayList();
对于(int i=0;i{
//更多说明。。。
列表。删除(此);
}).start();
}
问题是关于IntelliJ为指令list.remove(list)显示的警告代码>告诉我:ArrayList可能不包含MyClass类型的对象
是IntelliJ的错误分析,还是我的场景中的这个
关键字引用了封闭类MyClass
?这个
引用了MyClass
实例
这是因为您使用的是lambda表达式,它本身不具有this
上下文
但即使用匿名子类替换lambda表达式,如下所示:
class MyClass{
final ArrayList<Thread> list= new ArrayList<>();
for(int i=0;i<N;i++)
new Thread(()->{
//more instructions...
list.remove(this);
}).start();
}
new Thread(new Runnable() {
public void run() {
list.remove (this);
}
})
然后this
将引用Runnable
的匿名子类,而不是线程
实例。此关键字引用调用该方法的对象。在本例中,是MyClass。您的列表包含线程。您的代码试图从包含线程的列表中删除此对象(myclass)
这毫无意义我找到了一个适合我需要的解决办法:
class MyClass{
final ArrayList<Runnable> list= new ArrayList<>();
for(int i=0;i<N;i++)
new Thread(new Runnable() {
@Override
public void run() {
//more instructions...
list.remove(this);
}
}).start();
class-MyClass{
最终ArrayList=新ArrayList();
对于(int i=0;i您可以使用Runnable来避免这个
关键字冲突。改用Runnable
将帮助您避免包装上下文。您的lambda函数不是线程
的成员;它只是被传递到线程构造函数中。因此这个
不能是您的线程对象。是的,我理解它他意识到了警告,问题是为什么MyClass被引用而不是线程,但根据@MC Emperon的响应,这是因为使用了lambda表达式不是因为lambda,而是因为您在该类(MyClass)中定义了方法。每次使用“this”在类蓝图中,它将引用调用该方法的实例。MC EMP指出lamba表达式不会更改“this”所引用的内容。