zoukankan      html  css  js  c++  java
  • Java 并发编程:任务执行器 Executor 接口

    任务执行器(Executor)是一个接口,位于java.util.concurrent包下,它的作用主要是为我们提供任务与执行机制(包括线程使用和调度细节)之间的解耦。比如我们定义了一个任务,我们是通过线程池来执行该任务,还是直接创线程来执行该任务呢?通过Executor就能为任务提供不同的执行机制。执行器的实现方式各种各样,常见的包括同步执行器、一对一执行器、线程池执行器、串行执行器等等。下面我们将分别介绍这四种执行器,以帮助我们来理解执行器概念。

     同步执行器

    同步执行器是最简单的执行器,提交给它的任务将由调用线程直接执行,不需要其它线程的帮忙。如下演示代码中,DirectExecutor继承了Executor,它的execute方法直接调用了Runnable的run方法。我们在主线程中创建DirectExecutor对象后执行MyTask任务,实际上该任务将由调用线程(主线程)直接执行,最终输出executing task…。

     

     

    一对一执行器

    一对一执行器就是一个任务由一个线程负责,每个任务提交给执行器时都将创建一个新的线程来执行该任务。如下代码中,ThreadPerTaskExecutor的execute方法会新建一个线程执行任务。

    线程执行器

    线程池执行器就是拥有线程池功能的执行器,任务提交后将由线程池负责执行。我们将自己模拟实现一个简单的线程池,ThreadPoolExecutor类包含了任务队列taskQueue和十个工作线程workers,构造函数中会创建十个线程并通过while(true)循环不断从任务队列中取出任务并执行。而execute方法则是将任务添加到任务队列中,然后工作线程会执行任务队列中的任务。

     

     串行执行器

    串行执行器是一种具有串行功能的执行器,所有任务被加入到一个先进先出队列中,然后内部的另外一个执行器会按照队列的顺序执行任务。前一任务执行完后负责启动后一任务的执行,这样就形成了串行。我们看下简单的实现,SerialExecutor类中包含了一个任务队列和执行器,这里使用ThreadPerTaskExecutor执行器。SerialExecutor的execute方法负责将任务加入到队列中,而且还负责开启第一个任务的执行。finally块主要负责启动下一个任务,从而形成环环相扣。

    总结

    Executor只是一个接口,它提供了任务和执行的解耦机制。我们分析了几种常见执行器的实现,实际工程上可以根据自己实际情况来设计实现任务执行器。JDK也为我们提供若干有用的执行器,后面有机会我们将对其进行分析。

     

  • 相关阅读:
    API设计和微服务
    Eolinker与API文档
    mysql由浅入深探究(一)----数据库简介与mysql安装
    HttpSession详解
    运行python程序的时候不停的输出destroy和clean信息
    ERROR 1221 (HY000): Incorrect usage of UNION and ORDER BY
    GitLab / Github如何修改默认主分支
    mac安装pyenv和遇到的奇怪问题
    Python Pytest装饰器@pytest.mark.parametrize详解
    gitLab项目左侧找不到”setting"选项链接
  • 原文地址:https://www.cnblogs.com/ibytecoding/p/14137845.html
Copyright © 2011-2022 走看看