繁体   English   中英

如何在Runnable中捕获封闭范围

[英]How to capture enclosing scope in Runnable

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

[1]是否通过引用从随附的示波器中捕获了ret

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

[奖励] 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版本 它仍然应该是“有效的最终”或将其移至成员变量。

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

ret是局部变量,因此需要有效地最终确定。 这意味着,在将ret初始化后,如果将ret分配给另一个值,编译器会抱怨。 因此,[1]会导致编译器错误。

这是因为Java语言架构师希望防止局部变量(在方法中声明的变量)从声明它的方法之外的其他地方更改。

有关从封闭方法捕获变量的更多信息:

this确实是指Runnable实例。 但是,可以使用Stream.this引用封闭的Stream实例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM