올바른 메서드를 사용하여 다른 스레드에서 뭔가를 호출하는지 궁금합니다. Android에서이 작업을 수행하고 있지만 일반적인 Java 질문이라고 생각합니다.익명의 runnable에 사용 된 final int 매개 변수
일부 매개 변수가있는 메소드가 있습니다. 그들이 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를 사용하는 것이 안전합니다, 무엇입니까? x와 y 매개 변수에 대한 최종 키워드를 생략하면 이클립스는 불평 할 것이다. 그것은 저에게 것, 저것은 일정한 수만 그런 경우에 사용하기 위하여 예정된다이다. 상수가 아니라면 괜찮습니까? Java는이 함수에 전달하여 상수를 '만들'나요?
하지만 JNI를 사용하여 native에서 Test.callInMainThread를 호출하려고합니다. 자바가 그 숫자가 상수인지 아니면 내 의견으로는 알 수있는 방법이 없습니다. 자바가 어떤 마법을 걸 것을 믿을 수 있습니까? 항상이 방법으로 작동할까요? 사용하는 것이
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가 아니면 차이가 있습니까?
업데이트 : 나는 자바에서 어떤 의미인지를 이미 알고 있습니다. 그건 문제가되지 않습니다. 요점은 Runnable 생성시 변수의 범위가 어디에 있는지입니다. 그들은 지역 주민들입니다. 즉, 기능이 끝난 후에는 그 가치를 참조 할 수 없습니다. Runnable 객체가 다른 쓰레드에 전달되어 실행될 때까지 기다렸다가 그 값을 어디에 저장 하는가?
(동일하지가 보유 케이스, 반전 대칭 이름. 다소 단순화 된). 이러한 매개 변수는 익명의 Runnable의 run() 메서드를 생성 할 때 사용되기 때문에 final이어야합니다. callInMainThread (x = 3, y = 5)를 실행하면 public void run()이 Main1.mainOnlyWork (3, 5)로 본문을 생성하고 로컬 또는 전역 변수를 참조하지 않습니다. 이것이 제가 찾던 것입니다. 그 시점에서 작성된 Runnable.run()의 코드에 저장됩니다.그리고 쓰레드간에 전달할 때 코드는 변경되지 않습니다. – Pihhan