线程池有哪几种经常在Java面试被问到,下面我就来详解常见的6种线程池种类与区别@mikechen
1.固定大小线程池
采用newFixedThreadPool实现,该线程池在初始化时就创建固定数量的线程,线程数不变。
固定大小线程池示例:
ExecutorService executorService = Executors.newFixedThreadPool(5); for (int i = 0; i < 10; i++) { executorService.execute(new Task(i)); } executorService.shutdown();
这种线程池适合任务量比较稳定的场景。
2.缓存线程池
第二种线程池是 CachedThreadPool,可以称作可缓存线程池,采用newCachedThreadPool实现。
如下所示:
ExecutorService executorService = Executors.newCachedThreadPool(); for (int i = 0; i < 10; i++) { executorService.execute(new Task(i)); } executorService.shutdown();
当线程池中的线程空闲一定时间后,会自动销毁这些线程,这种线程池适合短时间内需要大量线程的场景。
3.单线程线程池
该线程池只有一个线程,所有任务都按照先后顺序依次执行,采用newSingleThreadExecutor实现。
如下所示:
ExecutorService executorService = Executors.newSingleThreadExecutor(); for (int i = 0; i < 10; i++) { executorService.execute(new Task(i)); } executorService.shutdown();
这种线程池适合需要顺序执行任务,保证任务按照一定顺序执行的场景。
4.定时线程池
这个线程池就是为了定时而发明的,它支持定时或周期性执行任务,比如:10秒钟执行一次任务。
采用newScheduledThreadPool实现,如下所示:
public class ThreadPoolMain { public static void main(String[] args) { ScheduledExecutorService service = Executors.newScheduledThreadPool(10); Runnable task01 = new Runnable() { @Override public void run() { String time = LocalDateTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss")); System.out.println(time+":schedule 执行了"); } }; String time = LocalDateTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss")); System.out.println(time+":开始执行"); service.schedule(task01, 10, TimeUnit.SECONDS); } }
newScheduledThreadPool(int n) 创建一个固定大小的线程池,其中包含 n 个线程,可以用来执行定时或周期性任务。
5.分治线程池
分治线程池:该线程池将大任务分割成多个小任务,并将这些小任务提交到线程池中执行。
如下所示:
ForkJoinPool forkJoinPool = new ForkJoinPool(); Task task = new Task(0, 100); forkJoinPool.invoke(task);
该线程池可以将多个小任务并行执行,从而加速大任务的执行速度,这种线程池适合需要处理大量数据或执行时间较长的任务的场景。
以上就是常见的线程池的种类详解,更多线程,请查看:线程池超详解(原理流程参数及创建使用)
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》