说我有一个名为“示例”的课程
在“示例”中我有一个内部类,它是一个可运行的
我在“Example”
中执行runnablepublic 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是公共的吗?
答案 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()
被调用,如果它们是公共的或私有的,则没有区别。