任务: 包括被执行任务需要实现的接口:runnable和callable 任务的执行: 包括任务执行机制的核心接口Executor,以及继承自ExecutorExecutorService接口,他有两个关键实现类:ThreadPoolExecutor和ScheduledThreadPoolExector 异步计算的结果:包括接口Future和它的实现FutureTask类 Executor是Executor框架的基础,他将任务的提交与执行分离开 ThreadPoolExecutor是线程池的核心实现类,用来执行被提交的任务 ScheduledThreadPoolExecutor可以延后或定期执行任务 Future接口和实现类FutureTask代表异步返回的结果 Runnable和Callable的实现类都可以被ThreadPoolExecutorScheduledThreadPoolExecutor执行 主线程首先创建实现Runnbale或者Callable接口的任务对象。工具类Executors可以把一个Runnable对象封装为一个Callable对象(Executors.callable(Runnable task)或Executors.callable(Runnable task,Object result))
然后可以把Runnable对象直接交给ExecutorService执行(ExecutorService.execute(Runnable command));或者也可以把Runnable对象或Callable对象提交给ExecutorService执行(ExecutorService.submit(Runnable task))或ExecutorService.submit(Callable task)
ExecutorService.submit(Callable task)会返回一个futuretask对象,调用get方法等待任务执行完成,获取结果
ThreadPoolExecutor使用工具类Executors来创建,可以创建三种:1.SingleThreadExecutor/FixedThreadPool/CachedThreadPool 1).FixedThreadPool 创建指定线程数量
public static ExecutorService newFixedThreadPool(int nThreads) public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory)2)SingleThreadExecutor 单个线程,顺序执行
public static ExecutorService newSingleThreadExecutor() public static ExecutorService newSingleThreadExecutor (ThreadFactory threadFactory)3)CachedThreadPool 大小无界的线程
public static ExecutorService newCachedThreadPool() public static ExecutorService newCachedThreadPool (ThreadFactory threadFactory)2.ScheduledThreadPoolExecutor 执行周期任务 1)ScheduledThreadPoolExecutor: 包含多个有界线程
public static ScheduledExecutorService newScheduledThreadPool (int corePoolSize) public static ScheduledExecutorService newScheduledThreadPool (int corePoolSize, ThreadFactory threadFactory)2)SingleThreadScheduledExecutor 只有一个线程,顺序执行
public static ScheduledExecutorService newSingleThreadScheduledExecutor() public static ScheduledExecutorService newSingleThreadScheduledExecutor(ThreadFactory threadFactory)3.Future接口 当我们把Runnable或Callable接口的实现类submit给ThreadPoolExecutor或ScheduledThreadPoolExecutor,返回给我们一个futuretask对象,通过get获取异步的结果
public Future<?> submit(Runnable task) public <T> Future<T> submit(Callable<T> task) public <T> Future<T> submit(Runnable task, T result)4.Runnable接口和Callable接口 Runnable接口没有返回值,Callable接口有返回值,executors提供吧runnable包装成callable
public static <T> Callable<T> callable(Runnable task,T result) public static Callable<Object> callable(Runnable task)1.FixedThreadPool 核心线程数=最大线程数,使用无界队列LinkedBlockingQueue keepAlieveTime为大于核心线程数少于最大线程数的那部分线程等待新任务的最长时间,超过这个时间多余的线程被终止 1)如果当前运行的线程少于corePoolSize,则创建新线程来执行任务。 2)当当前运行的线程数等于corePoolSize,将任务加入LinkedBlockingQueue 3)线程执行完1中的任务后,会反复从LinkedBlockingQueue来获取任务执行 使用无界对了带来的影响: 1)当线程池中的线程数达到corePoolSize后,新任务将在无界队列中等待,因此线程池中的线程数不会超过corePoolSize。 2)由于1,使用无界队列时maximumPoolsize将是一个无效参数 3)由于1和2,使用无界队列时keepAliveTime将是一个无效参数 4)使用无界队列,运行中的fixThreadPool不会使用拒绝策略 2.SingleThreadExecutor 核心线程数=最大线程数=1 1)如果当前运行的线程少于corePoolSize,则创建新线程来执行任务。 2)当当前运行的线程数等于corePoolSize等于1,将任务加入LinkedBlockingQueue 3)线程执行完1中的任务后,会反复从LinkedBlockingQueue来获取任务执行 3.CachedThreadPool corePoolSize=0。maximumPoolSize=Integer.Max_value,keepAlieveTime=60,最大线程是无界的,.CachedThreadPool使用没有容量的synchronousQueue作为线程池的工作队列,但是线程数是无界的,意味着,如果主线程提交任务的速度高于线程池中线程处理任务的速度,CachedThreadPool会不断创建新的线程 1)首先执行offer,如果当前maximumPool中有空闲线程正在执行poll,那么主线程执行offer操作与空闲线程执行的poll操作配对成功,主线程把任务交给空闲线程执行 2)当初始maximumPool,活着maximumPool没有空闲线程,将没有线程执行poll,将失败,此时cachedThreadPool会创建一个新线程执行任务 3)在2中新创建的线程将任务执行完后会执行pool,这个poll操作会让线程最多在Synchronous中等待60s,如果60s内主线程提交了一个新的任务,执行1,,那么这个空闲线程将执行主线程提交的新任务;否则60s之后空闲线程被终止
它的执行分为两部分
1)当调用ScheduledThreadPoolExecutor的scheduleAtFixedRate()方法或者scheduleWithFixedDelay()方法时,会向ScheduledThreadPoolExecutor的DelayQueue(无界队列)添加一个实现了RunnableScheduleFuture接口的ScheduleFutureTask。 2)线程池中的线程从队列中获取ScheduleFutureTask任务 ScheduledThreadPoolExecutor scheduledFutureTask主要包含三个成员 time,表示这个任务将要被执行的具体时间 sequenceNumber,表示这个任务被添加到ScheduledThreadPoolExecutor的序号 period,表示任务执行的间隔周期 DelayQueue封装了一个PriorityQueue,会对队列中的ScheduleFutureTask进行排序,现比较时间,然后比较sequenceNumber