Передача параметров в функцию, вызванную в отдельном потоке - PullRequest
3 голосов
/ 30 марта 2019

Рассмотрим следующий код Java на Android. Я запускаю темы в цикле for. Внутри потока я вызываю метод с параметрами, которые изменяются циклом for. Правильно ли переданы параметры start_index и end_index, чтобы цикл for не изменял значение этих параметров после вызова потока?

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();


                    }

1 Ответ

0 голосов
/ 30 марта 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...