1. 程式人生 > >Java 繼承Thread類和實現Runnable介面的區別

Java 繼承Thread類和實現Runnable介面的區別

java中執行緒的建立有兩種方式
1. 通過繼承Thread類,重寫Thread的run()方法,將執行緒執行的邏輯放在其中;
2. 通過實現Runnable介面,例項化Thread類;

繼承Thread類:

public class TestThreadDemo extends Thread {
    int num = 3;

    public TestThreadDemo(String ThreadName) {
        super(ThreadName);
    }

    @Override
    public void run() {
        for
(int i = 0; i < 10; i++) if (num > 0) { System.out.println(Thread.currentThread().getName() + "--->" + num--); } } public static void main(String[] args) { new TestThreadDemo("執行緒一").start(); new TestThreadDemo("執行緒二").start(); new
TestThreadDemo("執行緒三").start(); } }

輸出的結果:
這裡寫圖片描述

通過實現Runnable介面


public class TestRunnable implements Runnable {
    int num = 3;

    public TestRunnable() {
    }

    @Override
    public void run() {
        for (int i = 0; i < 10; i++)
            if (num > 0) {
                System.out.println(Thread.currentThread().getName() + "--->"
+ num--); } } public static void main(String[] args) { TestRunnable tr = new TestRunnable(); new Thread(tr, "執行緒一").start(); new Thread(tr, "執行緒二").start(); new Thread(tr, "執行緒三").start(); } }

輸出的結果:
這裡寫圖片描述

我們會發現兩種實現執行緒的方式輸出的結果不同,為什麼會出現這種情況呢?我們可以這樣思考一下:new TestThreadDemo()建立了三個物件時同時建立了三個執行緒,每個執行緒都有一個run()方法執行任務;第二種方法是三個執行緒共同的執行一個run()方法去執行任務,至於我輸出的都是執行緒一,這個話可能是在搶CPU資源時,被執行緒一搶到了。至於執行緒二和執行緒三在執行的過程中,沒有搶到資源。

在我們剛接觸的時候可能會迷糊繼承Thread類和實現Runnable介面實現多執行緒,其實在接觸後我們會發現這完全是兩個不同的實現多執行緒,一個是多個執行緒分別完成自己的任務,一個是多個執行緒共同完成一個任務。

其實在實現一個任務用多個執行緒來做也可以用繼承Thread類來實現只是比較麻煩,一般我們用實現Runnable介面來實現,簡潔明瞭。
大多數情況下,如果只想重寫 run() 方法,而不重寫其他 Thread 方法,那麼應使用 Runnable 介面。這很重要,因為除非程式設計師打算修改或增強類的基本行為,否則不應為該類(Thread)建立子類。