一、自定义线程池集成ThreadPoolExecutor
二、JDK自带的几种线程池
1、newFixedThreadPool
newFixedThreadPool,创建固定大小的线程池,poolCoreSize和MaxPoolSize相等,到达coreSize则将新的任务放到缓存队列,有线程执行完毕,直接去取。
创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待 。
2、newSingleThreadExecutor
newSingleThreadExecutor,创建一个单线程的核心池,核心池的大小和最大池大小为1。
创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。示例代码如下:
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();
}
}
});
}
结果依次输出,相当于顺序执行各个任务。
3、newCacheThreadPool
无大小限制的线程池,提交一个任务就创建一个线程执行。
创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。线程池为无限大,当执行第二个任务时第 一个任务已经完成,会复用执行第一个任务的线程,而不用每次新建线程。
4.newScheduledThreadPool
创建一个定长线程池,支持定时及周期性任务执行。
延迟执行。
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
scheduledThreadPool.schedule(new Runnable() {
@Override
public void run() {
System.out.println("delay 3 seconds");
}
}, 3, TimeUnit.SECONDS);
周期执行
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秒执行一次。
ScheduledExecutorService比Timer更安全,功能更强大。
网友评论