java - 如何捕获 Runnable 中的封闭范围

标签 java android multithreading

我正在尝试使用下面的类在 HandlerThread 上进行更新流,但我有几个关于 Java 中变量捕获如何工作的问题。

[1] ret 是否通过引用从封闭范围中捕获?

[2]this 是否引用 Runnable,还是从封闭范围捕获的?

[bonus] StartStream 应将 Runnable 发布到处理程序线程,并且仅在 Runnable 时返回已完成。下面的代码会按预期工作吗?

public class Stream extends HandlerThread {
    Handler handler = null;

    Stream() {
        super("Stream");
        handler = new Handler(getLooper());
        start();
    }

    private int _startStream() { // Start some repeating update
        return 1;
    }

    public int StartStream() {
        int ret = -1;

        handler.post(new Runnable(){
            @Override public void run() {
                synchronized(this) {
                    ret = _startStream();    // [1]
                    this.notify();           // [2]
                }
            }
        });

        synchronized(this) {
            while(ret == -1) {
                try {
                    this.wait();
                }
                catch (InterruptedException e){}
            }
        }

        return ret;
    }
}

最佳答案

内部类对外部类有隐式引用。

要在匿名内部类中使用ret,它应该是最终的。局部变量不能作为非最终引用的原因是因为局部类实例在方法返回后可以保留在内存中。它还取决于java version 。但它仍然应该是“有效的最终”或将其移至成员变量。

this 指的是 Runnable,您应该使用 Stream.this 来封装它。

关于java - 如何捕获 Runnable 中的封闭范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36680161/

相关文章:

Android-如何在矢量图上实现中心比例动画

java - 每次创建android项目时都会出现错误

multithreading - 单线程进程是否只包含一个线程?

java - 检查 LocalTime.now 是否位于设定的持续时间内

java - 在二叉搜索树中计算 "sticks"(有一个 child 的节点)?

java - 必需 : com. app.appname.mainactivity,找到 : androidx.fragment.app.FragmentActivity

java - 为什么 Thread.join 的行为不符合预期

java - 为什么我不能在 Java 中使用两个线程持有同一个套接字?

java - JPA Toplink - 在流程开始时检查 Activity 事务的需要是什么?

java - java程序中的代理设置