網頁

2019/6/27

Java 使用ExecutorService來執行多執行緒

原本在Java使用多執行緒來做平行處理時,都是透過建立Thread物件,傳入Runnable,然後呼叫Thread.start()來執行,請參考Java 如何建立Thread

在Java 5新增了Concurrency API,其利用Thread Pool(執行緒池)來減少每次產生新執行緒的成本,也就是用ExecutorService執行多執行緒的效能較好。


例如下面使用Executors.newSingleThreadExecutor()產生ExecutorService的實例,也就是ThreadPoolExecutor。然後將要執行的Runnable物件傳入execute(Runnable command)方法來執行新的執行緒。

package com.abc.demo;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Main {

    public static void main(String[] args) {

        ExecutorService ex = Executors.newSingleThreadExecutor();
        
        // 執行一個新的執行緒a
        ex.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println("執行緒a");
            }
        });
        
        // 執行一個新的執行緒b
        ex.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println("執行緒b");
            }
        });
        
        ex.shutdown(); // 關閉ExecutorService的Thread pool

    }

}

執行結果如下

執行緒a
執行緒b

Executors為用來產生ExecutorService實例的工廠工具類別(Factory Utility Class),其提供多種靜態方法來產生Executor的實例,例如本範例的Executors.newSingleThreadExecutor()

Executors.newSingleThreadExecutor()用來產生單一個的worker thread來執行任務。

ExecutorService繼承Executor,除了execute(Runnable command)方法外,還提供submit(Callable<T> task)方法讓執行緒可回傳結果。

ExecutorServiceThread不同的是,執行execute()時執行緒會自動被執行,所以不用像Thread必須自己呼叫start()來執行。

執行緒任務完成後,要呼叫shutdown()方法來關閉Thread Pool,否則ExecutorService的執行緒會一直等待不會停止。

使用Executor來操作執行緒的好處是,其將執行緒的建立,執行等與任務的實作分開。原本用Thread實作多執行緒時,我們除了要實作被執行的任務(Runnable)邏輯外,來必須負責Thread的建立,初始化,執行等;而改用Executor只要把實作的任務丟給execute(Runnable command)就好,剩下執行緒的初始化及執行就由Executor幫我們處理。


參考:

沒有留言:

張貼留言