Мне интересно, использую ли я правильный метод для вызова чего-то в другом потоке. Я делаю это на Android, но думаю, что это общий вопрос Java.Заключительный параметр int, используемый в анонимном Runnable
У меня есть метод с некоторыми параметрами. Допустим, что они 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« постоянным », переходя к этой функции?
Но я хочу вызвать Test.callInMainThread из native, используя 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);
}
});
}
Таким образом, я защитить ценности от мусора сбора до работоспособной не используется и ушел. Должен ли я создавать обертки или отмечать окончательный x в параметрах метода безопасным? Когда я пытаюсь, последнее ключевое слово работает просто отлично. Однако в потоках я не думаю, что если он работает, это причина, по которой он будет работать всегда. Всегда ли это работает с финалом? Как это делается, если это так? Будет ли разница, если параметр не является примитивным типом, а Object?
Обновление: Я уже понимаю, какие конечные средства на Java. Это не вопрос. Вопрос заключается в том, где область переменных, используемых при создании Runnable. Они являются локальными, то есть после завершения функции их ценность не может быть указана. Где хранятся эти значения, когда объект Runnable передается в другой поток и ждет выполнения?
Я думаю, что я нашел ответ сам. Эти параметры должны быть окончательными, поскольку они затем используются при генерации метода run() анонимного Runnable. Если я запустил callInMainThread (x = 3, y = 5), public void run() будет сгенерировать тело как Main1.mainOnlyWork (3, 5), не ссылаясь ни на какую переменную, локальную или глобальную. Это то, что я искал. Он хранится в коде Runnable.run(), который создается в этой точке.И код не изменится при передаче между потоками. – Pihhan