[英]Java - Actionlistner in (not inner) runnable class doesn't perform
[英]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.