内部类在java中可运行

时间:2013-12-04 08:48:20

标签: java multithreading inner-classes

说我有一个名为“示例”的课程

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

我在“Example”

中执行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在主线程上运行,会发生什么?

从RunMe线程或主线程运行a和b吗?

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

3 个答案:

答案 0 :(得分:4)

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

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

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

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

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

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

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

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

答案 1 :(得分:0)

如果你的示例构造函数在其中

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

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

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

答案 2 :(得分:0)

内在类只是提取/转化的一种神奇的类型。

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()被调用,如果它们是公共的或私有的,则没有区别。