簡體   English   中英

將參數傳遞給在單獨線程中調用的函數

[英]Passing parameters to a function invoked in a separate thread

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


                    }

這些值實際上是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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM