Java 多線程編程--建立線程的兩種方式

進程與線程

進程:進程是一個程序運行的過程,是系統進行資源分配和調度的獨立單位java

線程:是進程中的實際運行單位,CPU調度的基本單位編程

一個進程在運行時,至少有一個線程在運行,這個線程成爲主線程,通常狀況下,主線程結束,子線程也會當即結束。bash

Java多線程

Java的多線程通常與Thread類有關,有兩種方式能夠實現Java的多線程:多線程

1.繼承Thread類ide

2.繼承Runnable接口函數

Thread類

先來看經過Thread類實現的多線程示例:spa

MyThrea.java
public class MyThread extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 1000; i++) {
            System.out.println(Thread.currentThread().getName()+":"+i);
        }
    }
}
------------------------------------
Main.java
public class Main {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.setName("myThread");
        myThread.start();
        for(int i=0;i<1000;i++){
            System.out.println(Thread.currentThread().getName()+":"+i);
        }
    }
}
複製代碼

Thread.currentThread().getName()是得到調用getName()方法的線程名。線程

MyThread類,它繼承自Thread類,同時重寫了run()方法。run()方法的做用就是指定線程的具體工做內容,在這裏是從0打印到1000設計

Main類,它建立一個MyThread類的實例,指定線程名字爲MyThread。而後調用start()方法。start()方法的做用是開啓一個新的線程並調用run()方法,此處就是myThread實例的run()方法。而後從0打印到1000code

輸出:
...(前面部分省略)
main:128
main:129
main:130
main:131
main:132
MyThread:71
MyThread:72
MyThread:73
main:133
main:134
MyThread:74
MyThread:75
MyThread:76
main:135
MyThread:77
MyThread:78
MyThread:79
main:136
MyThread:80
...(後面部分省略)
複製代碼

在該示例中,若是整個過程只有一個線程,那麼MyThread的輸出應該是到1000纔開始輸出main,但從上能夠看到main和MyThread交替輸出,因此整個過程有兩個線程。

同時該示例,每一次運行均可能獲得不一樣的輸出結果,由於當MyThread線程開啓後,便和main線程開始競爭CPU資源,若是是main先搶到CPU資源,那麼main先輸出;若是是MyThread先搶到CPU資源,那麼MyThread先輸出。在得到的CPU時間內,若是線程沒有執行完當前的任務,那麼會讓出CPU,再次參與資源競爭。

Runnable接口

Java對象僅支持單繼承,若是想要建立已經有一個父類的線程類,那麼就不能再繼承自Thread類,此時能夠經過實現Runnable接口。 示例:

MyThread.java
public class MyThread implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 1000; i++) {
            System.out.println(Thread.currentThread().getName() + ":" + i);
        }
    }
}
------------------------------------
Main.java
public class Main {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        Thread thread = new Thread(myThread, "MyThread");
        thread.start();
        for(int i=0;i<1000;i++){
            System.out.println(Thread.currentThread().getName()+":"+i);
        }
    }
}
複製代碼

Thread.currentThread().getName()是得到調用getName()方法的線程名。

MyThread類,它實現Runnable接口,重寫了run()方法。run()方法的做用就是指定線程的具體工做內容,在這裏是從0打印到1000

Main類,它建立一個MyThread類的實例,指定線程名字爲MyThread。而後以Thread類的構造函數建立一個Thread實例,設置線程名字爲myThread。而後調用start()方法。start()方法的做用是開啓一個新的線程並調用run()方法,此處就是myThread實例的run()方法。接着從0打印到1000

其運行結果與繼承Thread類實例運行結果相似。

在Thread類中有如下幾個構造方法:

Thread()

Thread(Runnable target)

Thread(Runnable target, String name)   (該方法爲實例調用的構造方法)

Thread(String name)

Thread(ThreadGroup group, Runnable target)

Thread(ThreadGroup group, Runnable target, String name)

Thread(ThreadGroup group, Runnable target, String name, long stackSize)

Thread(ThreadGroup group, String name)

複製代碼

在這8個構造函數中,有兩個Thread(Runnable target)和Thread(Runnable target, String name),能夠傳遞Runnable接口,說明支持傳入一個Runnable接口的對象

使用繼承Thread類的方式開發多線程應用程序在設計上是有侷限性的,由於Java是單繼承。使用實現Runnable接口的方式即可打破這種限制。

另外說明Thread.java類也實現了Runnable接口(能夠在源碼中看到實現Runnable接口),意味着構造函數Thread(Runnable target)能夠傳入任何一個實現了Runnable接口的對象,包括Thread類對象,這樣作徹底能夠將一個Thread對象中的run()方法交由其餘的線程進行調用

Java多線程的建立就講到這裏,我參考了<Java 多線程編程 核心技術 高鴻巖著>這本書籍

有任何問題、意見請在下面留言或者郵箱聯繫-310103270@qq.com
相關文章
相關標籤/搜索