1. 程式人生 > >Java多執行緒中的final和static

Java多執行緒中的final和static

看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。