原本在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)
方法讓執行緒可回傳結果。
ExecutorService
與Thread
不同的是,執行execute()
時執行緒會自動被執行,所以不用像Thread
必須自己呼叫start()
來執行。
執行緒任務完成後,要呼叫shutdown()
方法來關閉Thread Pool,否則ExecutorService
的執行緒會一直等待不會停止。
使用Executor
來操作執行緒的好處是,其將執行緒的建立,執行等與任務的實作分開。原本用Thread
實作多執行緒時,我們除了要實作被執行的任務(Runnable
)邏輯外,來必須負責Thread
的建立,初始化,執行等;而改用Executor
只要把實作的任務丟給execute(Runnable command)
就好,剩下執行緒的初始化及執行就由Executor
幫我們處理。
參考:
沒有留言:
張貼留言