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”所引用的内容。