int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory
一般來說,要使用這個構造方法。
corePoolSize:核心線程數
maximumPoolSize:最大線程數
keepAliveTime:非核心線程存活時間
unit:非核心線程存活時間的單位
workQueue:保存任務的隊列
threadFactory:創建線程的工廠
這裏面 maximumPoolSize必須大於等於corePoolSize。
按理說會啓動核心線程接受任務並一直存活,如果任務較多,會創建非核心線程來處理,非核心線程處理完後如果閒置一定時間,該非核心線程會被銷燬。如果任務超出了最大線程數,便放到任務隊列裏等待閒置的線程。
但是不同的隊列是有不同的效果的,如下:
workQueue如果是LinkedBlockingQueue,那麼maxinumPoolSize/keepAliveTime/unit是沒有意義的,因爲根本不會創建非核心線程,全部由核心線程來處理,如果任務數超出了核心線程便放到任務隊列裏面去等待空閒核心線程。這個情況要記得核心線程數不要太小,比如說1個,這樣是不行的,如果大批量任務來臨,會堵塞任務,造成任務堆積,都存到了LinkedBlockingQueue裏,而LinkedBlockingQueue的大小 是int最大值,便有可能造成內存不足,因爲你無法控制。
workQueue如果是SynchronousQueue,那麼這個隊列是沒有意義的。因爲來一個任務立即創建核心或非核心線程來處理,根本不會把任務存儲到隊列裏,如果超出最大線程數,會報異常。這個情況要小心線程開銷,如果任務很多,會瞬間創建很多線程。
threadFactory:實際上就是給線程自定義命名的,爲了出錯後好查看日誌的。
@Override
public Thread newThread(Runnable r) {
String name = "我的第一個線程";
System.out.println("啓動線程:"+name);
Thread t = new Thread(r, name);
return t;
}