user3656651:
Android上で次のJavaコードを考えてみましょう。私は、forループでスレッドを開始します。スレッド内では、私は、forループによって変更されたパラメータを持つメソッドを呼び出しています。パラメータ「中START_INDEX」と「END_INDEXは」スレッドが呼び出された後、ループのため、これらのパラメータの値を変更しないように正しく渡されていますか?
for (int i=0; i<chunk_counts*chunk; i+=chunk){
final int start_index=i; //start_index
final int end_index = i + chunk; //set end_index
new Thread(new Runnable() {
public void run() {
threadCount.getAndIncrement();
ProcessAttendanceAuto(data, start_index,
end_index);
}
}).start();
}
LppEdd:
これらの値は事実ですfinal
、ので、彼らがしているスレッドセーフ、あなたは彼らが時間の経過とともに変化する心配する必要はありません。また、ときにに渡されるRunnable
と、呼び出したときProcessAttendanceAuto
、彼らはコピーされています。
たとえば、この
final int startIndex = i;
final int endIndex = i + 1;
new Thread(new Runnable() {
public void run() {
final int test = startIndex;
final int test2 = endIndex;
}
}).start();
に変換されます
NEW java/lang/Thread
DUP
NEW so/Test$1
DUP
ILOAD 2
ILOAD 3
INVOKESPECIAL so/Test$1.<init> (II)V
INVOKESPECIAL java/lang/Thread.<init> (Ljava/lang/Runnable;)V
ここに
INVOKESPECIAL so/Test$1.<init> (II)V
あなたは、生成されたクラスを見ることができます
class $1 implements Runnable
2つの受け入れint
そのコンストラクタに引数を。
これは、値を意味startIndex
し、endIndex
コピーされます。