Java 将参数传递给在单独线程中调用的函数
考虑以下Android上的Java代码。我在for循环中启动线程。在线程内部,我使用for循环更改的参数调用一个方法。参数“start_index”和“end_index”的传递是否正确,以便for循环在调用线程后不会更改这些参数的值Java 将参数传递给在单独线程中调用的函数,java,android,multithreading,parameters,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
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();
}
for(int i=0;i这些值实际上是final
,因此它们是线程安全的,您不必担心它们会随着时间的推移而改变。此外,当传递到可运行的和调用ProcessAttendanceAutho
时,它们会被复制
比如说这个,
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
在其构造函数中接受两个int
参数。
这意味着将复制值startIndex
和endIndex
。太好了!非常感谢您共享此信息。多线程始终是一个挑战。
INVOKESPECIAL so/Test$1.<init> (II)V
class $1 implements Runnable