如何讓多個 Thread
並行,可以使用 ThreadPool
Java
的 Executor
接口,實現此接口的目的是讓線程的建立與執行分開。
class SimpleExecutor implements Executor {
@Override
public void execute(Runnable command) {
new Thread().start();
}
}
通常不會去自我實現 Executor ,而是使用 ThreadPoolExecutor 。
優點如下:
- Thread 能保持存活,等待新的任務,不隨著任務執行完而銷毀。
- Thread Pool 限制最大的 Thread 的數量,避免系統浪費。
- Thread 的生命週期被 Thread Pool 所掌握。
ThreadPoolExecutor 可以自定義一些設定:
ThreadPoolExecutor executor = new ThreadPoolExecutor(
int corePoolSize,
int maxPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue
);
corePoolSize
(核心緩衝池數量),ThreadPool 的 Thread 下限,Thread 的數量不會低於此數字。maxPoolSize
(最大緩衝池數量),ThreadPool 的 Thread 最大數量,如果 Thread 都被執行,則 Task 會先被放進 Queue 裡,等到有空閒的 Thread 出現為止。keepAliveTime
(最大閒置時間),如果超過閒置時間,則系統會回收超過 corePoolSize 的 Thread。unit
(閒置時間的單位)workQueue
(任務佇列類型),根據這佇列的類型所使用的演算法而不同
如果不想自己建立 ThreadPoolExecutor 也可以使用 Java 內建的!
- Executors.newCachedThreadPool() ,無窮的線程池,自動完成線程的回收。
- Executors.newSingleThreadExecutor(),單線程的線程池。
- Executors.newFixedThreadPool,固定線程數量的線程池。