別のスレッドで呼び出される関数にパラメータを渡します

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コピーされます。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=219563&siteId=1