Executor框架
发布日期:2021-05-06 23:23:03 浏览次数:24 分类:精选文章

本文共 2910 字,大约阅读时间需要 9 分钟。

Java Executor框架详解

在Java中,线程池的实现通过Executor框架来管理任务的执行。Executor框架将任务的提交与执行分离开来,通过两级调度模型(应用层和操作系统层)高效地管理线程资源。

Executor框架简介

Executor框架的两级调度模型可以分为以下几个部分:

  • 应用层:开发者通过提交Runnable或Callable任务到ExecutorService来执行任务。
  • 操作系统层:操作系统内核负责调度线程到可用的CPU。
  • Executor框架的结构与成员

    Executor框架主要包括以下关键成员:

  • 任务:包括被执行任务需要实现的接口,如Runnable或Callable。
  • 执行机制:核心接口Executor和继承自Executor的ExecutorService接口,主要由ThreadPoolExecutor和ScheduledThreadPoolExecutor实现。
  • 异步计算结果:通过Future接口和其实现类FutureTask来表示异步计算的结果。
  • Executor框架的使用示意图

    主线程通过以下步骤使用Executor框架:

  • 创建实现Runnable或Callable接口的任务对象。
  • 使用工具类Executors将Runnable包装为Callable。
  • 提交任务到ExecutorService执行,获取Future对象。
  • 等待任务完成并获取结果,或通过Future取消任务。
  • ThreadPoolExecutor详解

    ThreadPoolExecutor是Executor框架的核心实现类,主要用于执行被提交的任务。通过工厂类Executors,可以创建三种类型的ThreadPoolExecutor:

  • FixedThreadPool:固定线程数,适用于负载较重的服务器。
  • SingleThreadExecutor:单个线程,确保任务顺序执行。
  • CachedThreadPool:动态创建线程,适合执行大量短期任务。
  • FixedThreadPool的实现

    FixedThreadPool的核心参数包括:

    • corePoolSize:核心线程数。
    • maximumPoolSize:最大线程数。
    • keepAliveTime:空闲线程的存活时间。

    FixedThreadPool的执行流程:

  • 如果当前线程数少于corePoolSize,创建新线程执行任务。
  • 否则,将任务加入无界队列LinkedBlockingQueue中。
  • 空闲线程从队列中取任务循环执行。
  • SingleThreadExecutor的实现

    SingleThreadExecutor只使用一个线程执行任务,适用于需要保证任务顺序的场景。其核心参数与FixedThreadPool相同,主要区别在于使用单个线程执行所有任务。

    CachedThreadPool的实现

    CachedThreadPool的核心参数包括:

    • corePoolSize:0(核心线程数为空)。
    • maximumPoolSize:无界(Integer.MAX_VALUE)。

    其执行流程:

  • 如果没有空闲线程,立即创建新线程执行任务。
  • 空闲线程从SynchronousQueue中获取任务执行。
  • 空闲线程等待最多60秒后终止。
  • ScheduledThreadPoolExecutor详解

    ScheduledThreadPoolExecutor用于在指定延迟后执行任务,或定期执行任务。其核心实现包括:

  • DelayQueue作为任务队列,用于存储带有延迟的任务。
  • 使用PriorityQueue对任务进行排序,优先执行时间早的任务。
  • ScheduledThreadPoolExecutor的任务执行流程

  • 调度线程从DelayQueue中获取已到期的任务。
  • 执行当前任务,并更新其延迟时间。
  • 将修改后的任务放回DelayQueue中。
  • Future接口与FutureTask

    Future接口与FutureTask类用于表示异步计算的结果。FutureTask的三种状态:

  • 未启动:未执行run方法。
  • 已启动:执行run方法中。
  • 已完成:任务执行完成或被取消。
  • FutureTask的实现

    FutureTask基于AbstractQueuedSynchronizer(AQS)实现,通过Sync内部类管理同步状态。其获取和释放操作通过AQS实现:

  • 获取:调用acquireSharedInterruptibly方法,等待任务完成。
  • 释放:调用run方法或cancel方法,更新同步状态。
  • FutureTask的级联唤醒

    当线程执行get方法或cancel方法时,会唤醒所有等待的线程,形成级联唤醒效果,确保任务高效执行。

    示例代码

    以下是使用FutureTask的示例代码:

    private final ConcurrentMap
    > taskCache = new ConcurrentHashMap
    >();private String executionTask(final String taskName) throws InterruptedException, ExecutionException { while (true) { Future
    future = taskCache.get(taskName); if (future == null) { Callable
    task = new Callable
    () { @Override public String call() throws InterruptedException { return taskName; } }; FutureTask
    futureTask = new FutureTask
    (task); future = taskCache.putIfAbsent(taskName, futureTask); if (future == null) { future = futureTask; futureTask.run(); } } try { return future.get(); } catch (CancellationException e) { taskCache.remove(taskName, future); } }}

    总结

    通过以上内容可以看出,Executor框架通过两级调度模型高效地管理线程资源,适用于不同的任务执行场景。理解Executor框架的实现原理有助于更好地利用多核计算资源,提升应用性能。

    上一篇:python 链接 ORACLE 数据库,并打印数据.解决中文乱码问题
    下一篇:javascript 的中自定义StringBuffer类

    发表评论

    最新留言

    表示我来过!
    [***.240.166.169]2025年04月14日 08时18分25秒