Мне интересно, использую ли я правильный метод для вызова чего-то в другом потоке. Я делаю это на Android, но думаю, что это общий вопрос Java.
У меня есть метод с некоторыми параметрами. Допустим, они внутр.
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);
}
});
}
Теперь мой вопрос: безопасно ли использовать окончательные целые числа для создания анонимного запуска без каких-либо членов класса? Если я пропущу ключевые слова final для параметров x и y, Eclipse будет жаловаться. Мне кажется, что в таких случаях предполагается использовать только постоянные числа. Если я передам не константу, это нормально? Java «делает» его постоянным, переходя к этой функции?
Но я хочу вызвать Test.callInMainThread из собственного кода с помощью JNI. На мой взгляд, 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 работает просто отлично. Однако в потоках я не думаю, что если это работает сейчас, это будет работать всегда. Всегда ли это работает с финалом? Как это делается, если это так? Будет ли разница, если параметр будет не примитивного типа, а Object?
Обновление: я уже понимаю, что означает final в Java. Это не вопрос. Вопрос в том, где находится область переменных, используемых при создании Runnable. Они являются локальными, это означает, что после завершения функции на их значение нельзя ссылаться. Где хранятся эти значения, когда объект Runnable передается другому потоку и ожидает выполнения?