繁体   English   中英

内部类在java中可运行

[英]Inner class runnable in java

说我有一个名为“示例”的班级

在“示例”里面我有一个内部类,它是一个可运行的

我执行“示例”中的runnable

public class Example {
    public Example() {
       //executing the runnable here
    }

    private void a() {
    }
    public void b() {
    }

    public class RunMe implements Runnable {

       public void run() {
           a();
           b();
       }

    }
}

假设Example在主线程上运行,会发生什么?

a和b是从RunMe线程还是主线程运行的?

a是私有的,b是公共的吗?

你错过了关键代码,使我们能够回答你的问题 - 构造函数。

如果您的构造函数如下所示:

public Example() {
    (new Thread(new RunMe())).start();
}

然后a()b()将在您刚刚创建的线程上运行(您调用它的“RunMe”线程)。

但是,如果您的构造函数如下所示:

public Example() {
    (new RunMe()).run();
}

那么你实际上并没有在另一个线程上运行它(你只是在另一个类中调用一个方法,它恰好被称为'run'),因此a()b()将在'main'上运行线。

私有/公共事物在这里是无关紧要的,因为RunMe是一个内部类,所以甚至可以访问Example私有方法。

如果您的示例构造函数包含在其中

new Thread(new RunMe()).start()

然后a()和b()将在该线程上运行。

但是,它们可能在构造函数完成执行之前运行,因此它们的行为将是未定义的。

内部类只是一些神奇的提取/转换类。

public static class Example$RunMe implements Runnable {

   // Autocode
   private final Example $this;
   public RunMe(Example _this){
       $this=_this;
   }

   public void run() {
       $this.a(); // even if private
       $this.b();
   }

}

所以,您呼叫的线程run的线程a()b()被调用时,它没有什么区别,如果他们是公共或私人。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM