美文网首页
10. Executor框架

10. Executor框架

作者: 星冉子 | 来源:发表于2020-02-13 10:08 被阅读0次

    Executor框架简介

    JDK将工作单元和执行机制分离,工作单元包括Runnable和Callable,执行机制由Executor框架提供;

    两级调度模型:Java使用Executor框架将任务映射为线程;操作系统将这些线程映射到硬件处理器上;

    Executor框架有3大部分组成:

    任务:包括Runnable和Callable接口;(创建任务,使用Executors提供的方法可以把Runnable转成Callable)

    任务的执行:包括Executor和ExecutorService接口及实现类ThreadPoolExecutor和ScheduledThreadPoolExecutor;(执行任务)

    异步计算的结果:包括接口Future和实现类FutureTask;(获取任务结果或取消任务FutureTask.cancel)

    ThreadPoolExecutor:使用工厂类Executors创建

    FixedThreadPool:固定线程数,适用于负载较重的服务器;coreSize=maxSize,超时时间为0,空闲线程不会等待新任务而被立即终止,使用无界的LinkedBlockingQueue接受任务,因此不会拒绝任务;

    SingleThreadExecutor:单线程,适用于顺序执行单个任务;coreSize=maxSize=1,其他同FixedThreadPool;

    CachedThreadPool:根据需要创建,无界线程池,适用于执行时间较短的小任务,负载较轻的服务器;coreSize为0,maxSize为Int最大值,超时时间为1分钟,使用SynchronousQueue,作为队列,极端情况会不断创建线程而耗尽CPU和内存;

    ScheduledThreadPoolExecutor:使用工厂类Executors创建

    ScheduledThreadPoolExecutor:固定线程数,适用于需要限制后台线程数的场景;

    SingleThreadScheduledExecutor:单线程执行;

    使用DelayQueue延迟队列作为工作队列,调度任务被封装成ScheduledFutureTask,工作队列为有限队列,按照执行时间和序列号排序;

    获取任务:先Lock上锁,获取第一个元素,若为空则Condition.await,否则则获取元素并signalAll所有等待线程;

    添加任务:先Lock上锁,再添加上元素,如果添加的是头元素则signalAll;

    FutureTask

    FutureTask实现Future接口和Runnable接口,状态包括:未启动(未执行run)、已启动(执行run)、已完成;

    get:未启动和已启动时会阻塞直到已完成,已完成时会立刻返回结果或抛异常;

    cancel:未启动时导致任务永远不会被执行,已启动时cancel(true)以中断的方式停止任务,cancel(false)不影响,已完成时返回false;

    基于AQS实现,内部实现Sync的同步器。

    相关文章

      网友评论

          本文标题:10. Executor框架

          本文链接:https://www.haomeiwen.com/subject/boptoctx.html