線程在java開發中是一個很重要的概念,今天在寫安卓程式時要添加線程,用到了run()、start()方法,一下子蒙了,把倆方法搞混淆了,印象中感覺效果是一樣的,趕快往回查查書和之前學java基礎時寫過的程式才明白過來。
之所以出現線程,就是為了更好的利用CPU,讓她更加“精明”的幹活。
程式通過調用Thread類的start()方法來啟動一個線程,這時此線程是處於就緒狀態,並沒有運行。然後通過此Thread類調用方法run()來完成其運行操作的,這裡方法run()稱為線程體,它包含了要執行的這個線程的內容,Run方法運行結束,此線程終止,而CPU再運行其它線程,而如果直接用Run方法,這隻是調用一個方法而已,程式中依然只有主線程--這一個線程,其程式執行路徑還是只有一條,這樣就沒有達到寫線程的目的。下面是一小段程式例子:public class TestThread1{ public static void main(String[] args){ Runner1 r=new Runner1(); //r.run();//這是方法調用,而不是開啟一個線程 Thread t=new Thread(r);//調用了Thread(Runnable target)方法。且父類物件變數指向子類對象。 t.start(); for(int i=0;i<100;i++){ System.out.println("進入Main Thread運行狀態"); System.out.println(i); } }}class Runner1 implements Runnable{ //實現了這個介面,jdk就知道這個類是一個線程 public void run(){ for(int i=0;i<100;i++){ System.out.println("進入Runner1運行狀態"); System.out.println(i); } }}
Thread對象的run()方法在一種迴圈下,使線程一直運行,直到不滿足條件為止,在你的main()裡建立並運行了一些線程,調用Thread類的start()方法將為線程執行特殊的初始化的過程,來配置線程,然後由線程執行機制調用run()。如果你不調用start()線程就不會啟動。
因為線程調度機制的行為是不確定的,所以每次運行該程式都會有不同的結果,你可以把你的迴圈次數增多些,然後看看執行的結果,你會發現main()的線程和Thread1是交替啟動並執行。
還有就是儘管線程的調度順序是不固定的,但是如果有很多線程被阻塞等待運行,發送器將會讓優先順序高的線程先執行,而優先順序低的線程執行的頻率會低一些。
線程的啟動是比較複雜的,需要為線程分配資源,它的START方法被調用時系統才會為線程分配資源。
上面調用線程的run方法只能算普通的方法調用一樣,得運行完run裡面的代碼整個程式才能往下進行,而如果調用start方法,線程和MAIN方法就會搶資源,列印的語句會交替出現,把線程裡的迴圈次數加到300,試一下依次調run、start和兩次都調start方法時所出現的情況應該能看出點端倪~~~