iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 4
1
Software Development

30 天介紹 Java 的 Thread系列 第 4

Day4:寫簡單 Java Thread Sample Code (二)

延續昨天介紹寫簡單 Java Thread Example 的部份,今天使用實作 Runnable interface 的方式,來開 Java 多執行緒的程式,sample code 如下:

public class ThreadExample2 implements Runnable {
    private String message;
    public ThreadExample2(String message){
        this.message = message;
    }
    @Override
    public void run() {
        System.out.println("Thread message is:" + this.message);
    }
}

上面的程式主要是 implement Runnable 的 class,並且實作了 run method,用來印出建構子傳入的 message,以下的程式就來啟動上面所實作的 Thread 程式。

public class Test {
    public static void main(String args[]) {
      Thread thread1 = new Thread(new ThreadExample2("message1"));
      Thread thread2 = new Thread(new ThreadExample2("message2"));
      Thread thread3 = new Thread(new ThreadExample2("message3"));
      Thread thread4 = new Thread(new ThreadExample2("message4"));
      Thread thread5 = new Thread(new ThreadExample2("message5"));

      thread1.start();
      thread2.start();
      thread3.start();
      thread4.start();
      thread5.start();
    }
}

上面的 main 主程式裡,啟動多執行緒的方式與昨天繼承 Thread class 方式一樣都是呼叫 start 方法,不一樣的地方在於實作 Runnable interface是把實作的 class 傳入到 Thread 的建構子裡去,而不是真接 new 出 Runnable 的實作再呼叫 start 方法。

以上的程式輸出的結果如下:

Thread message is:message1
Thread message is:message2
Thread message is:message3
Thread message is:message5
Thread message is:message4

我們會發現輸出的結果不會按照順序從 message1 到 message5有序的輸出,而且每次執行的結果都有可能會不一樣。

簡單的整理一下使用繼承 Thread class的方式和實作 Runnable interface 的方式來撰寫 Java 多執行緒的主要差別如下:
1.使用繼承 Thread 的方式來實作的話之話就不能繼承其它的 class,但是使用實作 Runnable 的方式之後還是可以實作其它 Interface 或是繼承其它有需要的 class

2.使用繼承 Thread 的方式直接 new Thread 繼承的 class 就可以 start,但是使用實作 Runnable 的方式需要再 new 一個 Thread 的 class,再把實作的 Runnable 傳入 Thread 的建構子裡面,才能呼叫 start 方法。

3.在使用共享資源方面使用 Runnable 的 interface 較為方便

另外如果我們要把正在執行的執行緒暫停,可以使用 Thread.sleep(毫秒數) 的方式,程式如下:

public class ThreadExample2 implements Runnable {
    private String message;
    public ThreadExample2(String message){
        this.message = message;
    }
    @Override
    public void run() {
        try {
            Thread.sleep(5000L);
            System.out.println("Thread message is:" + this.message);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    } 
}

以上的程式在執行 Thread 的時侯會先暫停 5 秒的時間,之後在執行輸出 message 到 console 上。


上一篇
Day3:寫簡單 Java Thread Sample Code (一)
下一篇
Day5:使用 Java Thread 的 wait、notify方法
系列文
30 天介紹 Java 的 Thread30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言