ThreadPoolExecutor類簡介
在java線程池中的newCachedThreadPool,newFixedThreadPool,newSingleThreadExecutor,newScheduledThreadPool這四個線程池在底層都是調用了ThreadPoolExecutor()這個構造方法。
若Executors這個類無法滿足我們的需求的時候,可以自己創建自定義的線程池,ThreadPoolExecutor類的定義如下
public ThreadPoolExecutor(int corePoolSize,//核心線程數--線程池初始化創建的線程數量
int maximumPoolSize,//最大線程數,線程池中能創建的最大線程數
long keepAliveTime,//線程存活時間
TimeUnit unit,//線程存貨時間單位
BlockingQueue<Runnable> workQueue,//一個阻塞隊列
ThreadFactory threadFactory//拒絕策略
) {……}
這個ThreadPoolExecutor()構造方法,對於隊列是什麼類型的比較關鍵,
1.在使用有界隊列的時候:
public class MyTask implements Runnable{
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public MyTask(int id, String name) {
super();
this.id = id;
this.name = name;
}
@Override
public void run() {
try {
System.out.println("run taskId = "+this.id);
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public String toString() {
return Integer.toString(this.id);
}
}
上面創建了一個類實現了Runable()接口public class MyThreadPool {
public static void main(String[] args) {
/**
* 1.在使用有界隊列的時候:若有新的任務需要執行,如果線程池實際線程數小於corePoolSize核心線程數的時候,則優先創建線程。
* 若大於corePoolSize時,則會將多餘的線程存放在隊列中,
* 若隊列已滿,且最請求線程小於maximumPoolSize的情況下,則自定義的線程池會創建新的線程,
* 若隊列已滿,且最請求線程大於maximumPoolSize的情況下,則執行拒絕策略,或其他自定義方式。
*/
ThreadPoolExecutor pool = new ThreadPoolExecutor(// 自定義一個線程池
1, // coreSize
2, // maxSize
60, // 60s
TimeUnit.SECONDS, new ArrayBlockingQueue<>(3) // 有界隊列,容量是3個
);
MyTask task1 = new MyTask(1, "task1");
MyTask task2 = new MyTask(2, "task2");
MyTask task3 = new MyTask(3, "task3");
MyTask task4 = new MyTask(4, "task4");
MyTask task5 = new MyTask(5, "task5");
MyTask task6 = new MyTask(6, "task6");
/**
* 此處可以一步步打開看執行結果是不是符合上面註釋所說的情況。
*/
pool.execute(task1);
pool.execute(task2);
pool.execute(task3);
pool.execute(task4);
// pool.execute(task5);
// pool.execute(task6);
pool.shutdown();
}
}
創建了一個自定義的線程池。