Executor框架分析实践1——入门

Executor框架——基础知识

Executor框架是Java用来管理多线程执行task的一套框架,本篇先介绍些此框架涉及到的几个重要的类。

介绍一些基类

  • Callable——有返回值的task

  • Runnable——无返回值的task

  • RunnableFuture——通过Future来获取Runnable的执行结果

  • Executor类——task执行类

Executor类定义如下:

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

Excutor类只有一个接口executor(Runnable command),用于将任务分解为单独task,并没有规定每个task必须运行在新线程中,也可以运行在调用线程。
异步运行的例子:

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

另外,很多Executor要求task的实施必须是在某种特定的条件,比如,特定的时间,如何执行,下面这个例子要求task顺序执行。

class SerialExecutor implements Executor {
final Queue tasks = new ArrayDeque<>();
final Executor executor;
Runnable active;

SerialExecutor(Executor executor) {
  this.executor = executor;
}

public synchronized void execute(final Runnable r) {
  tasks.add(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);
  }
}
}}
  • ExecutorService类——关闭Task,Future

ExecutorService类提供了terminate方法,可以终止一个task。也提供了submit方法,能够返回一个feature用于跟踪task执行的过程
* ExecutorService可以被关闭,一旦进入shut Down,禁止task再被加入进来,会报RejectedExecutionException。一旦调用shutDown,对于已提交的(submitted)的task允许执行完成,但禁止添加新task;shutDownNow,阻止已经进入等待状态的task,也会尝试阻止当前正在执行的task。一旦进入shutDown状态,不会有active的task,也不会有task等待执行,更不能添加新的task。
* 一个没有用的Executor应该会被及时释放,资源可以循环利用;
* submit方法可以看成execute函数的升级版,返回了Feature类,用于获取runnable执行的状态,包括是否取消,是否已完成,完成后获取result
* invokeAny和invokeAll函数用于执行大部分的execute任务,执行一个task或执行一个collection,等待一个或所有task执行完成;

官方demo

    ExecutorService pool = Executors.newFixedThreadPool(poolSize);
    try {
    for (;;) {
      pool.execute(runnable);
    }
    } catch (IOException ex) {
        pool.shutdown();
    }

another 官方demo,先shutdown,禁止增加task,等待60s后查看是否terminate,如果没有调用shutdownNow立即关闭:

void shutdownAndAwaitTermination(ExecutorService pool) {
pool.shutdown(); // Disable new tasks from being submitted
try {      // Wait a while for existing tasks to terminate
  if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {
    pool.shutdownNow(); // Cancel currently executing tasks
    // Wait a while for tasks to respond to being cancelled
    if (!pool.awaitTermination(60, TimeUnit.SECONDS))
        System.err.println("Pool did not terminate");
  }
} catch (InterruptedException ie) {
  // (Re-)Cancel if current thread also interrupted
  pool.shutdownNow();
  // Preserve interrupt status
  Thread.currentThread().interrupt();
}
}}
  • Future类——查看task执行状态

    • cancle——尝试取消task,如果task已经执行完成或者已经被取消,或者因为某些原因不能被取消,返回false;如果task没有开始,cancle之后task不会再被执行;如果task已经开始了,那么mayInterruptIfRunning参数会决定是否通过打断线程来终止task;
    • isCancle
    • isDone
    • get()阻塞式获取,等待知道task执行完成,然后获取他的result。还有另外一个method,限制了等待的时间 V get(long timeout,TimeUnit unit)
  • FutureTask类——Future类的基本实现类implementation

    • 前面都是interface,此类为具体实现,包括cancle,get,run等等;
    • task的几个状态
      • NEW -> COMPLETING -> NORMAL
      • NEW -> COMPLETING -> EXCEPTIONAL
      • NEW -> CANCELLED
      • NEW -> INTERRUPTING -> INTERRUPTED
  • Executors类——executorServices的工厂类

    • 负责生产ExecutorService、Executor、ScheduledExecutorService、ThreadFactory,callable
    • 利用ThreadPoolExecutor类来生成各式各样的ThreadPool
    • 未完,待续
  • ThreadPoolExecutor类——利用线程池中的thread来execute每个被submitted的task

    • Inter的高三位用来存放runState,剩下的用来存放worker的个数,所以runState的类型是int
    • Worker 内部类,保存了运行task的thread的中断控制,扩展了AbstractQueuedSynchronizer,简化了获取lock和释放lock的操作。内部参数:Thread(控制task运行的线程),Runnable(第一个task)

    • execute函数通过addWorker来实现
    • 内部参数:
      • ThreadFactory(用来产生线程),
      • workQueue(runnable的queue),
      • worker(task通过worker的run来运行,控制中断)
      • workers(worker的HashSet,用来管理worker),
      • corePoolSize(最小保持alive的线程数),
  • Easy Demo

未完待续。。。

你可能感兴趣的:(Executor框架分析实践1——入门)