Java并发编程的艺术笔记(十)

10. Executor框架

Executor框架大致分为三部分:

  • 任务:Runnable、Callable这两个接口
  • 任务执行:核心接口Executor、继承于Executor的ExecutorService、两个实现ExecutorService接口的实现类(ThreadPoolExecutor和ScheduledThreadPoolExecutor)
  • 异步计算的结果:Future接口、Future接口的实现类FutureTask

Executor框架主要包含的类和接口

  • Executor:基本接口,将任务的提交和任务的执行分隔开
  • ThreadPoolExecutor:线程池的核心实现类,用来执行被提交的任务
  • ScheduledThreadPoolExecutor:实现类,可以在给定的延迟后执行命令,或者定时任务
  • Future、FutureTask:异步计算结果
  • Runnable、Callable:都可以被ThreadPoolExecutor、ScheduledThreadPoolExecuto执行

在这里插入图片描述

1. ThreadPoolExecutor线程池

  • FixedThreadPool:可重用固定线程数的线程池

    1. 临时线程执行完任务后,就会被终止
    2. 使用LinkedBlockingQueue无界阻塞队列,所以基本上不会使用拒绝策略
    3. 采用的是固定线程数
  • SingleThreadlExecutor:单个Worker线程的Executor

    1. 核心线程数和固定线程数均为1
    2. 和ThreadPoolExecutor使用的一样,都是LinkedBlockingQueue无界阻塞队列
  • CachedThreadPool:

    1. 核心线程数为0,最大线程数为Integer.MAX_VALUE
    2. 线程存活时间为60秒
    3. 使用的是SynchronousQueue作为工作队列

2. ScheduledThreadPoolExecutor线程池

  • ScheduledThreadPool:

    1. 使用DelayQueue作为任务队列,DelayQueue中封装了一个PriorityQueue,排序时time时间短的在前面,两个任务time时间相同时,先提交的在前面
    2. ScheduledFutureTask中含有time(被执行的时间)、sequenceNumber(被添加的序号)、period(间隔周期)

四种线程池简单使用:https://blog.csdn.net/qq_40788718/article/details/103104205

3. FutureTask

AQS:https://juejin.im/post/5aeb07ab6fb9a07ac36350c8

FutureTask是基于AQS实现的,同时FutureTask继承继承了RunnableFuture,所以既可以作为Future接收Callable的返回值,又能作为Runnale被执行。

FutureTask可用于异步获取执行结果或取消执行任务的场景。通过传入Runnable或者Callable的任务给FutureTask,直接调用其run方法或者放入线程池执行,之后可以在外部通过FutureTask的get方法异步获取执行结果,因此,FutureTask非常适合用于耗时的计算,主线程可以在完成自己的任务后,再去获取结果。另外,FutureTask还可以确保即使调用了多次run方法,它都只会执行一次Runnable或者Callable任务,或者通过cancel取消FutureTask的执行等。

原文链接:https://blog.csdn.net/linchunquan/article/details/22382487

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值