【问题标题】:Inner class runnable in java可在java中运行的内部类
【发布时间】:2013-12-20 16:00:58
【问题描述】:

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

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

我在“示例”中执行可运行文件

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 是公开的重要吗?

【问题讨论】:

  • 我在您的代码中看不到线程:假设您创建为示例字段,将可运行对象传递给线程并执行它,在线程中执行 Runme,可以看到 a 和 b是一个内部类,不管修饰符。
  • 是的,我的意思是在Example的构造函数中的线程中执行runnable,所以你的意思是说Example的两个方法都将在线程上运行而不是在主线程上运行?

标签: java multithreading inner-classes


【解决方案1】:

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

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

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

然后a()b() 将在您刚刚创建的线程(您称之为“RunMe”线程)上运行。

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

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

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

private/public 在这里无关紧要,因为RunMe 是一个内部类,因此甚至可以访问Example 的私有方法。

【讨论】:

    【解决方案2】:

    如果您的 Example 构造函数在其中

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

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

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

    【讨论】:

      【解决方案3】:

      内部类只是某种神奇的提取/转换。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-05
        • 2017-05-09
        • 1970-01-01
        相关资源
        最近更新 更多