一、自定義線程池集成ThreadPoolExecutor
二、JDK自帶的幾種線程池
1、newFixedThreadPool
newFixedThreadPool,創(chuàng)建固定大小的線程池,poolCoreSize和MaxPoolSize相等,到達coreSize則將新的任務放到緩存隊列,有線程執(zhí)行完畢,直接去取。
創(chuàng)建一個定長線程池,可控制線程最大并發(fā)數(shù),超出的線程會在隊列中等待 。
2、newSingleThreadExecutor
newSingleThreadExecutor,創(chuàng)建一個單線程的核心池,核心池的大小和最大池大小為1。
創(chuàng)建一個單線程化的線程池,它只會用唯一的工作線程來執(zhí)行任務,保證所有任務按照指定順序(FIFO, LIFO, 優(yōu)先級)執(zhí)行。示例代碼如下:
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
for (int i = 0; i < 10; i++) {
final int index = i;
singleThreadExecutor.execute(new Runnable() {
@Override
public void run() {
try {
System.out.println(index);
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
結果依次輸出,相當于順序執(zhí)行各個任務。
3、newCacheThreadPool
無大小限制的線程池,提交一個任務就創(chuàng)建一個線程執(zhí)行。
創(chuàng)建一個可緩存線程池,如果線程池長度超過處理需要,可靈活回收空閑線程,若無可回收,則新建線程。線程池為無限大,當執(zhí)行第二個任務時第 一個任務已經完成,會復用執(zhí)行第一個任務的線程,而不用每次新建線程。
4.newScheduledThreadPool
創(chuàng)建一個定長線程池,支持定時及周期性任務執(zhí)行。
延遲執(zhí)行。
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
scheduledThreadPool.schedule(new Runnable() {
@Override
public void run() {
System.out.println("delay 3 seconds");
}
}, 3, TimeUnit.SECONDS);
周期執(zhí)行
scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println("delay 1 seconds, and excute every 3 seconds");
}
}, 1, 3, TimeUnit.SECONDS);
表示延遲1秒后每3秒執(zhí)行一次。
ScheduledExecutorService比Timer更安全,功能更強大。