每天一道Java題「10」

編程語言 Java 技術 科技優家 2017-05-29

題目

闡述創建線程最常用的兩種方法及其對比。

解答

方法一:繼承Thread類實現

步驟:

  1. 創建Thread類的子類,如MyThread。
  2. 重寫Thread類的run方法。
  3. 實例化MyThread類,對象名如myThread。
  4. 運用Thread類的start方法啟動線程,如myThread.start。

方法二:實現Runnable接口

步驟:

  1. 創建一個類,如MyRunnableThread,實現Runnable接口。
  2. 創建MyRunnableThread類的對象。
  3. 實例化Thread類,對象名如thread,並向其構造函數傳入MyRunnableThread類和線程名兩個參數。
  4. 運用Thread類的start方法啟動線程,如thread.start。

繼承Thread類創建線程與實現Runnable接口創建線程的不同之處在於,當用同一個類創建多個線程的時候,前者實際上是創建了多個不同的Thread對象,它內部的run方法執行的時候是在各自對象中執行,互不干擾,如同多個線程執行多個任務;而後者實際上是使用同一個對象來創建多個線程,所以對象內的屬性會公用,那就相當於多個線程在執行同一個任務一樣。

另外,在使用上,繼承了Thread類的類就不能繼承其它類了,而實現了Runnable接口的類,還可以繼承其他類,前者相對侷限。

這樣子說法可能有點抽象,下面那用代碼講解一下。

參考代碼

MyThread類

package me.huangzijian;

public class MyThread extends Thread {

    private int num = 10;
    private String name;

    public MyThread(String name) {
        this.name = name;
    }

    @Override
    public void run {
        int count = num;
        for (int i = 0; i < count; i++) {
 System.out.println(this.name + ":" + num);
 num--;
        }
    }
}

MyRunnable類

package me.huangzijian;

public class MyRunnableThread implements Runnable {

    private int num = 10;

    @Override
    public void run {
        int count = num;
        for (int i = 0; i < count; i++) {
 System.out.println(Thread.currentThread.getName + ":" + num);
 num--;
        }
    }
}

TheadCreation類

package me.huangzijian;

public class ThreadCreation {

    public static void main(String[] args) {
        // 繼承Thread類實現
        MyThread myThread1 = new MyThread("MyThread1");
        MyThread myThread2 = new MyThread("MyThread2");
        MyThread myThread3 = new MyThread("MyThread3");
        myThread1.start;
        myThread2.start;
        myThread3.start;

        // 實現Runnable接口
        MyRunnableThread myRunnableThread = new MyRunnableThread;
        Thread t1 = new Thread(myRunnableThread, "MyRunnableThread1");
        Thread t2 = new Thread(myRunnableThread, "MyRunnableThread2");
        Thread t3 = new Thread(myRunnableThread, "MyRunnableThread3");
        t1.start;
        t2.start;
        t3.start;
    }
}

運行結果:

運行ThreadCreation後,我們會看到,繼承Thread類實現的結果如下:

可以看到,三個線程對於字段num的操作是各操作各的,都將num從10減到1。

而實現Runnable接口的就誒過如下:

每天一道Java題「10」

可以看到,三個線程對同一個myRunnableThread對象的num進行共同的操作。根據程序,每個線程循環10次,所以num從10一直減到負數。有朋友可能會問,為什麼一開始三個線程都會獲取到10,這就是線程同步的問題了,需要用到synchronized等關鍵字進行修飾。

相關推薦

推薦中...