【发布时间】:2017-02-18 22:27:48
【问题描述】:
我没看懂下面的代码 sn-ps。这是我从 Android 的 AsynchronousChannelGroupImpl 类中获取的代码 sn-ps。下面这些我没看懂。
1) var1 被指定为 final,但我们在执行主体中对其进行了更改。
2) var1 指向从“new Runnable() {....}”创建的 Runnable 对象的内存地址。在 Runnable 对象的堆内存中,有 run() 方法。这个 run() 方法使用 AccessController 类变量到达 AccessControler 的 doPrivileged() 方法,该方法包含新创建的 PrivilegedAction 对象的内存地址和 var3 作为其参数。但是这个新创建的PrivilegedAction 对象再次调用了它的run() 方法来调用var1 的run() 方法。这是一种循环动作。
3)所以 var1 总是指向固定位置,因为它是最终的。它可以调用它的 run 方法,因为 run() 方法在它的内存地址中。但是,您每次创建的新 PrivilegedAction 对象没有定义且一致。我们不能说这个对象包含这么多堆内存空间,因为内部人员在那里,它再次要求 var1 以 var1.run() 的形式运行其 run() 方法
我想知道这个 sn-p 是如何改变系统内部的内存结构的?我想从计算机架构的角度了解。
public final void execute(final Runnable var1) {
SecurityManager var2 = System.getSecurityManager();
if(var2 != null) {
final AccessControlContext var3 = AccessController.getContext();
var1 = new Runnable() {
public void run() {
AccessController.doPrivileged(new PrivilegedAction() {
public Void run() {
var1.run();
return null;
}
}, var3);
}
};
}
this.executeOnPooledThread(var1);
}
【问题讨论】:
-
这甚至不会编译...你不能分配给最终变量..
-
@Selvin,我不是让你编译,我是让你看懂这段代码。为什么要编译这个?我解释了上面的一切。我能知道,你为什么要降级我的问题?
-
不是有效的java代码...你有什么不明白的?
-
而且,我说过,这个sn-p是从Android类AsynchronousChannelGroupImpl反编译的类。此类是 Android 库的一部分,并且 100% 有效。
-
不,它不是......我什至找到了这个类代码,它是不同的。在android和openjdk中。同样,您提供的代码 不是有效的 java 代码
标签: java android multithreading android-asynctask runnable