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

2016-07-23  本文已影响331人  maisie0731

Executor框架——基础知识

Executor框架是Java用来管理多线程执行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<Runnable> 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类提供了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();
}
}}

未完待续。。。

上一篇 下一篇

猜你喜欢

热点阅读