在 Java 语言中,并发编程往往都是通过创建线程池来实现的,而线程池的创建方式也有很多种,每种线程池的创建方式都对应了不同的使用场景。总结来说线程池的创建可以分为两大类:
1.通过 Executors 工厂来创建线程池
2.通过 ThreadPoolExecutor 创建
两个线程的创建方式有七种具体实现方式
1.使用线程工厂创建一个定长线程池 (newFixedThreadPool)
// newFixedThreadPool(2) 中2 是表示创建一个只有两个线程的线程池
ExecutorService executorService = Executors.newFixedThreadPool(2);
定长线程池(newFixedThreadPool)创建的时候必须指定线程池的大小,其中,
最多2个线程将处于活动状态。如果提交了两个以上的线程,那么它们将保持在队列中,直到线程可用,如果一个线程由于执行关闭期间的失败而终止,则执行器尚未被调用,则创建一个新线程。
线程会一直存在,直到池关闭。
newFixedThreadPool采用队列缓存线程的模式,但是队列中没有设置最大值默认是int的最大值,这样会导致内存问题。
2.使用工厂创建一个可缓存线程池 (Executors.newCachedThreadPool())
ExecutorService executorService = Executors.newCachedThreadPool();
创建一个可缓存的线程池,若线程数超过人物所需,那么多余的线程会被缓存一段时间后再回收,若线程数不够,则会新建线程。CachedThreadPool 是根据短时间的任务量来决定创建的线程数量的,所以它适合短时间内有突发大量任务的处理场景。
3.使用工厂创建一个单线程线程池(newSingleThreadExecutor())
ExecutorService executorService = Executors.newSingleThreadExecutor();
单线程线程池可以保证先进先出的顺序 (个人感觉就是一个单独的队列数据保持先进先出的顺序)
4.使用工厂创建一个可以执行延迟任务的线程池
ExecutorService executorService = Executors.newScheduledThreadPool(2);
创建⼀个可以执⾏延迟任务的线程池 可以已固定频率周期执行也可以执行一次
5.使用工厂创建一个单线程延迟线程池
ExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
跟单线程池newSingleThreadExecutor相似只是可以延迟执行线程
6.使用工厂创建一个抢占式执⾏的线程池 (其中的任务执行顺序不确定,JDK1.8新加线程池)
ExecutorService executorService = Executors.newWorkStealingPool();
7.自定义线程池创建 ThreadPoolExecutor(最原始的创建线程池的⽅式,它包含了 7 个参数可供设置)
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();