Эти значения в действительности равны 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
принимает два int
аргумента в своем конструкторе.
Это означает, что значения startIndex
и endIndex
скопированы.