2015年8月3日 星期一

Java上課練習:多執行緒

多執行緒(multi-thread)

可以同時執行多個程式區塊,使程式執行的效率變高

範例:
列印100次Hello(單執行緒)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
public class Test1 {
    
    public static void main(String[] args) {

        for (int i = 0; i < 100; i++) {
            System.out.println("MAin Hello " + i);
        }

    }

}
顯示結果:
MAin Hello 0
MAin Hello 1
MAin Hello 2
MAin Hello 3
MAin Hello 4
.....
MAin Hello 97
MAin Hello 98
MAin Hello 99

多執行緒:建立一個hello class 繼承 Thread,將迴圈寫在執行緒的實作mothod
在原本main迴圈下,新增兩組執行緒
有三個執行緒在執行,main 執行緒執行 main() ,建立了另外兩個執行緒 h1 與 h2
h1和h2沒有先後之分,完全取決於程式
且每次執行結果不會一樣,每個執行緒分配到多少時間是不固定的
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//建立執行緒
class Hello extends Thread {

    public void run() { //執行緒實作的方法,工作內容
        for (int i = 0; i < 100; i++) {
            System.out.println(getName()+" hello " + i);
        }

    }
}

public class Test1 {
    
    public static void main(String[] args) {
        //main 執行緒執行 main() 
        //main()
        for (int i = 0; i < 100; i++) {
            System.out.println("MAin Hello " + i);
        }
        
        //建立 h1 執行緒
        Hello h1 = new Hello();
        h1.setName("h1"); //指定執行緒名稱
        //h1.run(); //呼叫,使用此方法還是單執行緒
        h1.start(); //啟動 h1 執行緒,不是呼叫 Thread,而是要啟動
        
        //建立 h2 執行緒
        Hello h2 = new Hello();
        h2.setName("h2");
        h2.start();

    }

}
顯示結果
MAin Hello 97
MAin Hello 98
MAin Hello 99
h2 hello 0
h1 hello 0
h2 hello 1

當執行緒 start( ) 後,不能重複啟動,否則會導致 IlleagalThreadStateException 例外

多執行緒摘要

  • 執行順序執行順序 與 程式開工(啟動)順序無關,由系統控制
  • 每個執行緒所分配到的 CPU 時間不是固定的,由系統控制
  • 執行緒啟動後,由系統分配時間執行 run( ) ,我們不會自己主動去呼叫 run( )
  • 主類別 main() 方法的執行,是由系統產生的 main執行緒 執行
  • 執行緒 start( ) 後,不能重複啟動,會導致例外
  • 取得執行當前程式碼的執行緒
    Thread.currentThread()
  • 取得 與 設定 執行緒物名稱
    getName( )
    setName( )


沒有留言:

張貼留言