将参数传递给在单独线程中调用的函数

时间:2019-03-30 11:30:10

标签: java android multithreading parameters

请考虑以下Android上的Java代码。我在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 :(得分:0)

这些值实际上是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自变量。
这意味着将复制值startIndexendIndex