【问题标题】:Runnable code is looping its actions可运行代码正在循环其操作
【发布时间】: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


【解决方案1】:

Java 反编译字节码不适合程序员。不要把你的逻辑放在那里。

【讨论】:

    猜你喜欢
    • 2019-05-29
    • 2018-02-28
    • 2016-03-24
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    相关资源
    最近更新 更多