常见的七种线程池:
(1)newSingleThreadExecutor():单个线程的线程池,即线程池中每次只有一个线程工作保证所有任务按照指定顺序执行(FIFO,LIFO,优先级),单线程串行执行任务。
(2)newFixedThreadPool():创建一个定长的线程池,每提交一个任务就占用一个线程。直到线程池的最大数量,然后后面进入队列的就得在空出线程之前一直等待。
(3)newCacheThreadPool():可缓存线程池(推荐使用),当线程池大小超过了处理任务所需的线程数时,那么就回收部分线程(一般是60S内未执行)。当任务需要的线程数超过了线程池中已有的线程数时,又会创建一定量的线程来满足任务使用的需求。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。
(4)newScheduleThreadPool():创建一个定长的线程池,支持定时和周期性任务执行。
(5)newSingleThreadScheduledExcutor:创建一个单例线程池,定期或延时执行任务。
(6)newWorkStealingPool:创建持有足够线程的线程池来支持给定的并行级别,并通过使用多个队列,减少竞争,它需要穿一个并行级别的参数,如果不传,则被设定为默认的CPU数量。
(7) ForkJoinPool:支持大任务分解成小任务的线程池,这是Java8新增线程池,通常配合ForkJoinTask接口的子类RecursiveAction或RecursiveTask使用。
java线程池 作用:
限制系统中执行线程的数量
根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果;少了浪费了系统资源,多了造成系统拥挤效率不高。用线程池控制线程数量,其他线程排 队等候。一个任务执行完毕,再从队列的中取最前面的任务开始执行。若队列中没有等待进程,线程池的这一资源处于等待。当一个新任务需要运行时,如果线程池 中有等待的工作线程,就可以开始运行了;否则进入等待队列。
好处:1)减少创建,销毁线程的次数,每个线程可以被重复利用
2)可以根据系统的承受能力,调整线程池中工作线程的数量,防止消耗过多内存。