(八)guava实现线程池

Guava 有很多并发类,包含几个ExecutorService 实现,用MoreExecutors助手类来创建实例,无法直接或子类创建实例。

概要:2 直接执行(少用) MoreExecutors(多用)   3退出Executor服务  4监听装饰器Futures.allAsList() 

一、引入

(八)guava实现线程池_第1张图片

二、直接执行者

场景:在同一个线程中执行任务。简单起见,休眠 500 毫秒阻塞,执行调用完,立即可用

directExecutor() :返回静态单例,不会在对象创建上,带来开销

应该更喜欢用MoreExecutors.newDirectExecutorService(),调用时创建完整实现

(八)guava实现线程池_第2张图片

三、退出 Executor 服务

问题:线程池运行时关闭虚拟机,导致 JVM 工作时无限期挂起

解决:Guava 引入实例化好执行器 Executor 服务。守护线程,与 JVM 一起终止

           还提供了 Runtime.getRuntime().addShutdownHook() 添加关闭钩子设置 VM 放弃挂起前,等待预配置超时时间

例:无限循环任务,用包含 100 毫秒超时时间 已存在服务运行,超时后终止 VM 。如没exitingExecutorService将无限期挂起

(八)guava实现线程池_第3张图片

四、监听装饰器

监听装饰器允许封装ExecutorService提交任务时返回 ListenableFuture 实例,不是简单 Future 实例

1、ListenableFuture 扩展自 Future 接口:(用得少)可添加新方法 addListener(),添加完成时调用监听器

2、(用的多)Futures.allAsList() ,在单个 ListenableFuture 组合多个 ListenableFuture 实例,将所有futures 合并返回结果

(1)privateListeningExecutorService executorService = MoreExecutors.listeningDecorator(Executors.newCachedThreadPool());

(2)executorService.submit(() -> ctrlStrategy.dump(key, cache));

(八)guava实现线程池_第4张图片

http://cmsblogs.com/?p=10721

你可能感兴趣的:((八)guava实现线程池)