本篇簡單說明多執行緒(多線程)任務執行器ThreadPoolExecutor
的建構式參數。
ThreadPoolExecutor
為Java執行緒池(thread pool)的實作類別。
ThreadPoolExecutor
建構式如下。
ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler
)
corePoolSize
:核心執行緒數量,為池中保持的執行緒數量,即使沒有任務執行也仍會保持的執行緒數。不可小於0。maximumPoolSize
:最大執行緒數量,為池中允許最大的執行緒數量,超過corePoolSize
數的執行緒若閒置超過keepAliveTime
設定的時間會被消滅。不可小於1,不可小於corePoolSize
。keepAliveTime
:執行緒存活時間。超過corePoolSize
數的執行緒可閒置時間,當超過時間則執行緒會被終結。不可小於0unit
:時間單位,為keepAliveTime
的時間單位。workQueue
:任務隊列(BlockingQueue
),用來儲存待執行任務的Queue。不可為null。threadFactory
:執行緒工廠,用來建立ThreadPoolExecutor
執行任務時需要的執行緒。不可為null。handler
:拒絕處裡器。任務數量超過隊列上限無法被執行時的處理器。不可為null。
使用範例。
package com.abc.demo;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class Main {
public static void main(String[] args) {
ThreadPoolExecutor executor = new ThreadPoolExecutor(
5, // corePoolSize
10, // maximumPoolSize
5L, // keepAliveTime
TimeUnit.SECONDS, // unit
new LinkedBlockingQueue<Runnable>(10), // workQueue
Executors.defaultThreadFactory(), // threadFactory
new ThreadPoolExecutor.AbortPolicy() // handler
);
executor.execute(new Runnable() {
@Override
public void run() {
// task ...
}
});
executor.shutdown();
}
}
不過若無特殊需求一般用Executors.newFixedThreadPool(int nThreads)
建立ExecutorService
實例來使用即可。
package com.abc.demo;
import java.util.concurrent.*;
public class Main {
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(10);
executor.execute(new Runnable() {
@Override
public void run() {
// task ...
}
});
executor.shutdown();
}
}
Executors.newFixedThreadPool(int nThreads)
原始碼如下,相當於建立一個核心執行緒與最大執行緒相同的ThreadPoolExecutor
。
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
沒有留言:
張貼留言