Executor是Java线程池的顶级接口
接口中最核心的一个类:ThreadPoolExecutor 中的构造方法:
public ThreadPoolExecutor(int corePoolSize, // 10
int maximumPoolSize, // 10
long keepAliveTime, // 0L
TimeUnit unit, // 时间单位
BlockingQueue<Runnable> workQueue // 队列)
第一个参数:corePoolSize
- 池中所保存的线程数,包括空闲线程。 表示这个线程池一旦初始后,就存在了多少个线程。
第二个参数:maximumPoolSize
- 池中允许的最大线程数。当前这个线程池最大线程数。
第三个参数:keepAliveTime
- 当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间。当前线程空闲时间是多少,比如为0L,表示这个线程一旦执行完,直接回收,不做停留,不做任何空闲
第四个参数:unit
- keepAliveTime 参数的时间单位。第三个参数与第四个参数是一起用的
第五个参数:workQueue
- 执行前用于保持任务的队列。此队列仅保持由 execute 方法提交的 Runnable 任务。 如果没有空闲线程,任务将被暂缓到这个队列里面。
Executors是一个类
Executors类提供了若干个静态方法,用于生成不同类型的线程池:
1,Executors.newFixedThreadPool(int nThreads) // 创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。
外界传一个参数比如 10, 那么初始化10个线程,并且最大线程数量也是10,如果没有空余线程执任务时,任务将暂缓到这个无界队列中。
2,newCachedThreadPool() //创建一个可根据实际情况调整线程个数的线程池,不限制最大线程数量,如果来了一个任务,就创建一个线程,若无任务则不创建线程,并且每个线程会在60秒后自动回收
第一个参数,coreSize 为0,表示这个线程初始化时,是不创建线程的。开始是没有任何线程的
第二个参数, 表示 可以装多少个线程,Integer.MAX_VALUE 不限定多少个线程
第三,四个参数,表示60秒,比如一个任务执行完成后,该线程不立即回收,等待60秒后,看是否有第二个任务,如果有继续执行,如果没有,就回收。所以这边叫做CachedThreadPool。带有缓存的意思。
synchronousQueue<Runnable>()
3,
Executors.newScheduledThreadPool(int corePoolSize) 创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行
具体用法: 一个小例子
import java.util.concurrent.Executors; import java.util.concurrent.ExecutorService; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; class Temp extends Thread { public void run() { System.out.println("run"); } } public class ScheduledJob { public static void main(String args[]) throws Exception { Temp command = new Temp(); ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); // command代表一个任务,5 代表 初始化时延迟5秒执行这个任务,1代表 每隔1 秒轮询着执行这个任务,最后是时间单位,这里是秒 ScheduledFuture<?> scheduleTask = scheduler.scheduleWithFixedDelay(command, 5, 1, TimeUnit.SECONDS); } }