(八)guava实现线程池
Guava 有很多并发类,包含几个ExecutorService 实现,用MoreExecutors助手类来创建实例,无法直接或子类创建实例。
概要:2 直接执行(少用) MoreExecutors(多用) 3退出Executor服务 4监听装饰器Futures.allAsList()
一、引入
二、直接执行者
场景:在同一个线程中执行任务。简单起见,休眠 500 毫秒阻塞,执行调用完,立即可用
directExecutor() :返回静态单例,不会在对象创建上,带来开销
应该更喜欢用MoreExecutors.newDirectExecutorService(),调用时创建完整实现
三、退出 Executor 服务
问题:线程池运行时关闭虚拟机,导致 JVM 工作时无限期挂起
解决:Guava 引入实例化好执行器 Executor 服务。守护线程,与 JVM 一起终止
还提供了 Runtime.getRuntime().addShutdownHook() 添加关闭钩子,设置 VM 放弃挂起前,等待预配置超时时间
例:无限循环任务,用包含 100 毫秒超时时间 和 已存在服务来运行,超时后终止 VM 。如没exitingExecutorService ,将无限期挂起
四、监听装饰器
监听装饰器允许封装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));
http://cmsblogs.com/?p=10721