线程池类位于 java.util.concurrent 包
简介
Java虽然支持多线程,启动一个新的线程非常简单。但是频繁创建销毁线程需要消耗大量的系统资源(线程资源、栈空间等),更好的做法是使用【线程池】。

Java标准库提供ExecutorService接口表示线程池,它的典型用法如下:
// 创建固定大小的线程池:
ExecutorService executor = Executors.newFixedThreadPool(3);
// 提交任务:
executor.submit(task1);
executor.submit(task2);
executor.submit(task3);
executor.submit(task4);
executor.submit(task5);
常见的 ExecutorService 接口实现类:
(创建这些线程池的方法都被封装到Executors这个类中)
ExecutorService es = Executors.newFixedThreadPool(4);
3种线程池关闭方式:
【必要性说明】:线程池最后需要手动关闭。
import java.util.concurrent.*;
public class Main {
public static void main(String[] args) {
ExecutorService es = Executors.newFixedThreadPool(4);
for (int i = 0; i < 6; i++) {
es.submit(new Task());
}
// 关闭线程池:
es.shutdown();
}
}
class Task implements Runnable {
@Override
public void run() {
System.out.println("a");
}
}
创建动态线程池
原理:基于 CacheThreadPool 底层源码,创建存在 min 与 max 的线程池。

// 创建指定 min 与 max 的线程池
int min = 4;
int max = 10;
ExecutorService es = new ThreadPoolExecutor(min, max,60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>());
【小总结】
ScheduleThreadPool【定时任务】
简介:特殊的线程池,定时任务、可以反复执行。
执行类型:

ScheduledExecutorService s=Executors.newScheduledThreadPool(4);
// 1秒后执行任务,而且只执行一次。
ses.schedule(new Task("one-time"), 1, TimeUnit.SECONDS);
// FixedRate,10秒后开始执行定时任务,每3秒执行。
ses.scheduleWithFixedRate(new Task(),10,3, TimeUnit.SECONDS);
// FixedDelay,10秒后开始执行定时任务,每3秒执行。
ses.scheduleWithFixedDelay(new Task(),10,3, TimeUnit.SECONDS);
// lambda表达式
ses.schedule(()->{
System.out.PrintLn("hello");
}, 1, TimeUnit.SECONDS);
思考以下问题:
【Timer】说明:
Java标准库中海提供了一个java.util.Timer类,这个类也可以执行定时任务,但这个类所代表的是一个旧的体系,并不推荐,Shedule 完全可以代替 Timer。