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

Executor框架——基础知识

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

介绍一些基类

  • Callable——有返回值的task

  • Runnable——无返回值的task

  • RunnableFuture<T>——通过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<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类——关闭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

未完待续。。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,219评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,363评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,933评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,020评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,400评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,640评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,896评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,597评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,327评论 1 244
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,581评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,072评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,399评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,054评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,849评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,672评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,585评论 2 270

推荐阅读更多精彩内容