Java多執行緒的實現方法

weixin_34087301發表於2015-10-04
323464-6cc2507458a6dcf7.png

我們知道一個程式通常是一個程式,而一個程式可以有多個執行緒。
執行緒是不規律的在交替進行,哪個執行緒搶到cpu時間誰就執行。而執行緒執行過程中cpu也可能被其他執行緒搶走,然後又會繼續搶cpu時間。直到執行緒執行結束或者所在程式已經被關掉。

Java類庫已經為我們提供了一個執行緒基類Thread,因此建立執行緒非常簡單。

方法一

建立兩個類FirstThread和SecondThread都繼承Thread類,然後重寫run方法。

public class FirstThread extends Thread {

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("F --> " + i);
        }
    }
}
public class SecondThread extends Thread {

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("S --> " + i);
        }
    }
}

測試程式碼:

public class Test {

    public static void main(String[] args) {
        FirstThread ft = new FirstThread();
        SecondThread st = new SecondThread();
        // 用start()呼叫執行緒的run方法。
        // 注意這裡不能直接呼叫run(),否則就和普通的呼叫方法沒區別不會啟動執行緒
        ft.start();
        st.start();
    }

}

部分執行結果:

F --> 0
F --> 1
F --> 2
F --> 3
F --> 4
F --> 5
F --> 6
F --> 7
F --> 8
F --> 9
F --> 10
F --> 11
F --> 12
F --> 13
S --> 0
S --> 1
S --> 2
S --> 3
S --> 4
S --> 5
S --> 6
S --> 7
F --> 14
F --> 15
F --> 16
F --> 17
F --> 18
F --> 19
S --> 8
S --> 9
S --> 10
F --> 20

執行結果可以看到兩個執行緒不規律的互動進行互相搶cpu時間。
所以建立執行緒只需要繼承Thread類,然後在重寫的run方法裡寫下想線上程裡執行的程式碼即可。注意呼叫時用通過呼叫start方法來啟動執行緒而不能直接呼叫run方法。否則只是普通的呼叫方法並沒有多執行緒的效果。
另外此時程式可不止兩個執行緒。一共有四個執行緒,分別是Main方法所在的主執行緒FirstThread、SecondThread和垃圾回收執行緒。

方法二

因為Java只能單繼承,繼承了Thread類就不能再繼承別的類了。這樣顯得不夠靈活,所以實現繼承更推崇的是讓執行緒類實現Runnable介面。
以FirstThread為例:

public class FirstThread implements Runnable {

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("F --> " + i);
        }
    }
}

測試程式碼要改為直接建立Thread物件但是把實現了Runnable介面的類的物件作為引數傳進去。

public class Test {

    public static void main(String[] args) {
        Thread ft = new Thread(new FirstThread());
        Thread st = new Thread(new SecondThread());
        // 用start()呼叫執行緒的run方法。
        // 注意這裡不能直接呼叫run(),否則就和普通的呼叫方法沒區別不會啟動執行緒
        ft.start();
        st.start();
    }

}

以上可以起到和方法一一致的效果。
實際使用中這種實現執行緒的方法經常會寫成匿名內部類的形式,如以下這樣:

new Thread() {
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("匿名執行緒 --> " + i);
        }
    }
}.start();

Callable和Future

以上實現執行緒的方式雖然簡單但是有缺陷,就是run方法是void型別沒有返回值,而我們有時候希望執行緒執行完畢後返回一個結果。
程式碼共享

本文程式碼下載:百度網盤

相關文章