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也为我们提供若干有用的执行器,后面有机会我们将对其进行分析。

     

  • 相关阅读:
    Mayan游戏 (codevs 1136)题解
    虫食算 (codevs 1064)题解
    靶形数独 (codevs 1174)题解
    黑白棋游戏 (codevs 2743)题解
    神经网络 (codevs 1088) 题解
    The Rotation Game (POJ 2286) 题解
    倒水问题 (codevs 1226) 题解
    银河英雄传说 (codevs 1540) 题解
    生日蛋糕 (codevs 1710) 题解
    第一章 1.11 高阶函数
  • 原文地址:https://www.cnblogs.com/ibytecoding/p/14137845.html
Copyright © 2011-2022 走看看