聊聊高并发(三十八)解析java.util.concurrent各个组件(十四) 理解Executor接口的设计

简介:

JUC包中除了一系列的同步类之外,就是Executor运行框架相关的类。对于一个运行框架来说,能够分为两部分

1. 任务的提交

2. 任务的运行。

这是一个生产者消费者模式,提交任务的操作是生产者,运行任务的线程相当于消费者。


Executor接口设计的目的是专注于任务的运行。和任务的提交解耦。

任务的提交由任务的创建者处理。

Executor接口封装了任务运行的细节,比方怎样使用线程,是否定时运行等等。

Executor接口非常easy,就一个execute方法。

public interface Executor {
    void execute(Runnable command);
}

假设不使用Executor接口,直接用Thread显式地来运行一个Runnable。代码是这种

new Thread(new RunnableTask()).start()

而使用Executor接口运行Runnable的代码是这种

Executor executor = xxxExecutor;
executor.execute(new RunnableTask());

能够看到Executor接口的一个是屏蔽了任务运行的细节。

它全然能够直接使用Executor所在的线程直接同步运行任务

class DirectExecutor implements Executor {
    public void execute(Runnable r) {
       r.run();
    }
}

也能够使用单独的线程来运行任务,从而异步的运行任务。

class ThreadPerTaskExecutor implements Executor {
   public void execute(Runnable r) {
        new Thread(r).start();
     }
}

《Java并发编程实战》一书中将任务运行的细节称为运行策略。运行策略定义了任务运行的What, Where, When, How

1. 在什么(What)线程中运行任务?

2. 任务依照什么(What)顺序运行(FIFO,LIFO,优先级)

3. 有多少个(How Many)任务能并发运行

4. 在队列中有(How Many)任务在等待运行

5. 假设系统因为过载Overload而须要拒绝一个任务。那么应该选择哪一个(Which)任务?怎样(How)通知应用程序有任务被拒绝

6. 在运行一个任务之前或之后,应该进行哪些(What)动作?


这几点都是设计一个运行框架须要考虑的事情。比方ThreadPoolExecutor攻克了线程池的问题,ExecutorService攻克了运行任务生命周期管理的问题。ScheduleExecutorService攻克了定时运行任务的问题。


以下这个在Executor JavaDoc里的串行运行任务的Exector,能够看到怎样扩展Executor来自己定义运行的策略。

1. 封装了一个ArrayDeque队列来存放待运行的Runnable任务

2. 真正用来运行任务的Executor对象

3. 当前要运行的任务active对象

4. SerialExecutor的execute方法先讲传入的Runnable任务再封装一层,增加到tasks队列,保证这个任务运行完后会去调用scheduleNext()运行下一个任务。然后推断active对象是否是null,表示是第一次运行。就显式地运行scheduleNext().

5. scheduleNext()方法从队列中取任务运行

6. execute()和scheduleNext()都是synchronized方法。保证串行运行。


 class SerialExecutor implements Executor {
    final Queue<Runnable> tasks = new ArrayDeque<Runnable>();
    final Executor executor;
    Runnable active;
 
    SerialExecutor(Executor executor) {
      this.executor = executor;
    }
 
    public synchronized void execute(final Runnable r) {
      tasks.offer(new Runnable() {
        public void run() {
          try {
            r.run();
          } finally {
            scheduleNext();
          }
        }
      });
      if (active == null) {
        scheduleNext();
      }
    }
 
    protected synchronized void scheduleNext() {
      if ((active = tasks.poll()) != null) {
        executor.execute(active);
      }
    }
  }}







本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5082200.html,如需转载请自行联系原作者

相关文章
|
2月前
|
Java 数据安全/隐私保护 索引
(Java)Java里JFrame窗体的基本操作(组件篇-3)
回顾 说过了下拉框和下拉列表,本篇内容将了解滚动面板和各类输入框 什么是组件? 如果不熟悉组件,可以将组件看作是某个Form表单中的表单元素,组件可以完善JFrame窗口的布局,以及一些功能; 本篇内容中所有的组件所用到的类全都来自于javax.swing这个包中,记得引入; 另:在使用组件前,请先将窗体中的内容类给实例化出来进行操作,代码如下: Container c = getContentPane(); JScollPane JScollPane类,说的就是滚动面板。它不同于其他组件,它是一个容器,
87 1
|
2月前
|
Java 索引 容器
(Java)Java里JFrame窗体的基本操作(组件篇-2)
回顾 这算是JFrame窗体基本操作的组件第二篇了,上一篇说过了单选框,复选框,按钮。 在这一篇中,我会说明下拉框和列表框 什么是组件? 自行百度:java中JFrame窗体里的组件是什么? 名字都给你想好了 ( :I ) JComBox下拉框 JComBox类,就是下拉框,实例化出来后,要填写泛型&lt;&gt;,添加是什么数据类型的内容,泛型中就写上该数据类型; JComboBox&lt;?&gt; combox = new JComboBox&lt;&gt;(); 以下实例化下拉框的时候我泛型写的全
96 1
|
2月前
|
Java 容器
(Java)Java里JFrame窗体的基础操作(组件-1)
如果不熟悉组件,可以将组件看作是某个Form表单中的表单元素,当然这只是在不熟悉组件的前提下。如果深入了解了组件,那么它有着非常多的组件,这些组件可以完善JFrame窗口的布局,以及一些功能; 本篇内容中所有的组件所用到的类全都来自于javax.swing这个包中,记得引入
70 1
|
4月前
|
消息中间件 Java Kafka
Java 事件驱动架构设计实战与 Kafka 生态系统组件实操全流程指南
本指南详解Java事件驱动架构与Kafka生态实操,涵盖环境搭建、事件模型定义、生产者与消费者实现、事件测试及高级特性,助你快速构建高可扩展分布式系统。
264 7
|
6月前
|
Java 数据库连接 数据库
Java 组件详细使用方法与封装实战指南
本指南详解Java核心组件使用与封装技巧,涵盖跨平台开发、面向对象编程、多线程、数据库操作等关键内容,并提供工具类、连接池、异常及响应结果的封装方法。结合Spring框架、MyBatis、Spring Boot等主流技术,助你掌握高质量Java组件设计与开发实践。
209 2
|
3月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
|
9月前
|
数据采集 JSON API
深入解析:使用 Python 爬虫获取淘宝店铺所有商品接口
本文介绍如何使用Python结合淘宝开放平台API获取指定店铺所有商品数据。首先需注册淘宝开放平台账号、创建应用并获取API密钥,申请接口权限。接着,通过构建请求、生成签名、调用接口(如`taobao.items.search`和`taobao.item.get`)及处理响应,实现数据抓取。代码示例展示了分页处理和错误处理方法,并强调了调用频率限制、数据安全等注意事项。此技能对开发者和数据分析师极具价值。
|
11月前
|
数据可视化 前端开发 测试技术
接口测试新选择:Postman替代方案全解析
在软件开发中,接口测试工具至关重要。Postman长期占据主导地位,但随着国产工具的崛起,越来越多开发者转向更适合中国市场的替代方案——Apifox。它不仅支持中英文切换、完全免费不限人数,还具备强大的可视化操作、自动生成文档和API调试功能,极大简化了开发流程。
|
前端开发 JavaScript
React 步骤条组件 Stepper 深入解析与常见问题
步骤条组件是构建多步骤表单或流程时的有力工具,帮助用户了解进度并导航。本文介绍了在React中实现简单步骤条的方法,包括基本结构、状态管理、样式处理及常见问题解决策略,如状态管理库的使用、自定义Hook的提取和CSS Modules的应用,以确保组件的健壮性和可维护性。
287 17
|
9月前
|
数据采集 安全 数据挖掘
淘宝天猫宝贝详情页面商品评论采集接口全解析
淘宝天猫商品评论采集接口为电商数据挖掘提供了重要工具。通过分析海量评论,消费者可获取购买决策参考,商家能优化产品与服务,市场研究者则能洞察行业趋势与竞品表现。该接口支持Python请求,助力开发者构建智能分析应用,推动电商生态中各方价值提升。使用时需遵守平台规则,确保数据安全与合法利用。
288 15

推荐镜像

更多
  • DNS