Java多執行緒中的final和static
阿新 • • 發佈:2019-01-09
看Android的多執行緒發現其實是Java的多執行緒。我找了一本Java程式設計思想學習Java的併發機制。寫了一個demo,遇到一些問題,雖然最後想明白了,但是也暴露了我的Java基礎差勁的事實。之後我會通過寫部落格的方式來提高Java水平。現在說一下我的問題吧。
問題連結
這個問題最後答案的核心是:
Java的靜態變數在應用時只會初始化一次,但是可以多次賦值。
下面貼出兩個回答的程式碼片段來說明這個問題:
static int d=20;
final static int STATIC_FINAL_INT=d++;
//相當於
static int d=20;
final static int STATIC_FINAL_INT=d;
d=d+1;
//d是靜態變數屬於類變數,所以第二次及之後不會執行 static int c=20;
//STATIC_FINAL_INT 是靜態變數,所以其初始語句不會繼續執行。
//fina staticl int STATIC_FINAL_INT=d++;
//屬於初始化,只執行一次,所以STATIC_FINAL_INT的值不會改變;
//d=d+1屬於STATIC_FINAL_INT的初始化語句,所以不會繼續執行。所以d的值不會改變;
static int c=20;
final int staticInt=c++;
//相當於
static int c=20;
final int finalInt=c;
c=c+1;
//c是靜態變數屬於類變數,所以第二次及之後不會執行 static int c=20;
//finalInt不是靜態變數,所以其初始語句會繼續執行。
//final int finalInt=c++;屬於初始化,不止執行一次,
//所以finalInt的值會一直增大;
//c=c+1屬於finalInt的初始化語句,所以會繼續執行。所以c的值一直會一直增大;
Thread.run()和Thread.start()區別
1) start:
用start方法來啟動執行緒,真正實現了多執行緒執行,這時無需等待run方法體程式碼執行完畢而直接繼續執行下面的程式碼。通過呼叫Thread類的start()方法來啟動一個執行緒,這時此執行緒處於就緒(可執行)狀態,並沒有執行,一旦得到cpu時間片,就開始執行run()方法,這裡方法 run()稱為執行緒體,它包含了要執行的這個執行緒的內容,Run方法執行結束,此執行緒隨即終止。
2) run:
run()方法只是類的一個普通方法而已,如果直接呼叫Run方法,程式中依然只有主執行緒這一個執行緒,其程式執行路徑還是隻有一條,還是要順序執行,還是要等待run方法體執行完畢後才可繼續執行下面的程式碼,這樣就沒有達到寫執行緒的目的。總結:呼叫start方法方可啟動執行緒,而run方法只是thread的一個普通方法呼叫,還是在主執行緒裡執行。這兩個方法應該都比較熟悉,把需要並行處理的程式碼放在run()方法中,start()方法啟動執行緒將自動呼叫 run()方法,這是由jvm的記憶體機制規定的。並且run()方法必須是public訪問許可權,返回值型別為void。