我想知道我是否使用正确的方法来调用不同的线程中的东西.
我是在Android上做的,但认为它是通用的Java问题.
我有一些参数的方法.让我们说他们是int.
class Main1 { public static voID mainOnlyWork(int x, int y) { // not important here. }}class Test { Handler mHandler; // called from main thread, stored as reference. public test() { mHandler = new Handler(); } public static voID callinMainThread(final int x, final int y) { mHandler.post(new Runnable() { public voID run() { Main1.mainOnlyWork(x, y); } }); }
现在我的问题是,使用最终的int来创建没有任何类成员的匿名runnable是否安全?如果我省略x和y参数的最终关键字,Eclipse会抱怨.在我看来,在这种情况下,只打算使用常数.如果我不通过常数,可以吗? Java通过传递给这个函数“使它”变得不变吗?
但我想使用JNI从本机调用Test.callinMainThread.在我看来,Java无法判断这些数字是否是常数.我可以信任Java来制造一些魔法吗?它会一直这样吗?
我想也许我必须创建代理类,如:
private abstract RunnableXY implements Runnable { public RunnableXY(int x, int y) { this.x = x; this.y = y; } public int x; public int y; public abstract voID run();}
并且调用方法将使用:
public static voID callinMainThread(final int x, final int y) { mHandler.post(new RunnableXY(x,y) { public voID run() { Main1.mainOnlyWork(this.x, this.y); } }); }
这样,我保护值不受垃圾收集的影响,直到使用runnable并丢弃.我是否必须创建包装器,或者在方法参数中标记最终x是否安全?当我尝试它时,final关键字工作得很好.但是在线程中,我不认为它现在是否有效是它始终有效的原因.它最终是否有效?它是如何制作的?如果参数不是原始类型,而是对象,会有区别吗?
更新:
我已经理解了Java的最终意义.这不是一个问题.问题在于创建Runnable时使用的变量范围.它们是本地人,这意味着在功能结束后,它们的值无法被引用.当Runnable对象传递给其他线程并等待执行时,存储的值在哪里?
解决方法:
从基础开始:Java在传递参数时创建副本.您的方法接收的x和y不是传入的原始变量,它们是原始值的副本.声明这样的方法时,传入的值不必是常量,但方法接收的副本是1:
callinMainThread(final int x, final int y) { ..... }
第二:不,你不必制作包装纸.当您访问外部作用域本地的变量时,Java编译器会自动生成用于存储它们的字段,就像您手动创建的包装器一样.这对你来说是透明的.
您不能省略final的一个原因是因为Java没有实现任何机制来将更改传递给方法的局部变量和匿名类中生成的字段之间的变量值.此外,匿名类可能比方法调用寿命更长.如果匿名类在方法返回后读取或写入变量会发生什么?如果变量不是最终变量,则无法再读取其值或写入变量.
1实际上,最终变量不是常量.您可以为它们分配不同的值,但只能分配一次.调用方法时会分配final方法参数的值,因此它们在方法持续时间内几乎是恒定的.
总结以上是内存溢出为你收集整理的java – 匿名Runnable中使用的最终int参数全部内容,希望文章能够帮你解决java – 匿名Runnable中使用的最终int参数所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)