我想知道我是否使用正确的方法在不同的线程中调用某些东西。我在 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);
}
});
}
现在我的问题是,在没有任何类成员的情况下使用最终整数创建匿名可运行对象是否安全?如果我省略了 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 并将其丢弃。我是否必须创建包装器,或者在方法参数中标记 final x 是否安全?当我尝试它时,final 关键字工作得很好。但是在线程中,我不认为它现在是否有效是它始终有效的原因。它总是与final一起工作吗?如果有,它是如何制作的?如果参数不是原始类型而是Object,会有区别吗?
更新:我已经了解 Java 中 final 的含义。这不是问题所在。问题点是用于创建 Runnable 的变量范围在哪里。他们是本地人,这意味着在函数结束后他们的值不能被引用。当 Runnable 对象被传递给其他线程并等待执行时,这些值存储在哪里?