`
raymond.chen
  • 浏览: 1437297 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Guava的ListenableFuture使用范例

 
阅读更多

ListenableFuture是对JDK的Future的封装和增强,为Future添加回调机制。 JDK8也新增了CompletableFuture类实现了相同的功能,范例见 https://chenjumin.iteye.com/blog/2437228 ,建议用JDK8自带的CompletableFuture类。

 

public class ListenableFutureTest {
    private static int threadCount = 5; //线程数
	private static AtomicInteger count = new AtomicInteger(0);
    private static CountDownLatch countDownLatch = new CountDownLatch(threadCount);;
	
	public static void main(String[] args) throws Exception {
		//将 ExecutorService 转为 ListeningExecutorService
		ListeningExecutorService executorService = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));
        
		//提交多个任务
		List<ListenableFuture<Boolean>> futureList = new ArrayList<>();
		for(int i=0; i<threadCount; i++){
			ListenableFuture<Boolean> future = submitTask(executorService);
			futureList.add(future);
		}
		
		//堵塞方式获取所有任务的执行结果
		//如果任务出异常,会一直堵塞下去
//		System.out.println("堵塞等待执行结果...");
//		ListenableFuture<List<Boolean>> allFuture = Futures.allAsList(futureList);
//		allFuture.get(3000, TimeUnit.MILLISECONDS);
		
		countDownLatch.await();
		
        System.out.println("main task done");
        executorService.shutdown(); //等待task执行完后再shutdown
//        executorService.shutdownNow(); //停止执行中的task,立即shutdown
	}

	private static ListenableFuture<Boolean> submitTask(ListeningExecutorService executorService) {
		//提交Callable任务
		ListenableFuture<Boolean> future = executorService.submit(new Callable<Boolean>() {
			@Override
			public Boolean call() throws Exception {
				int t = 1000 + new Random().nextInt(2000);
				System.out.println(t);
				Thread.sleep(t);
				
				if(count.incrementAndGet() == 1){
					throw new RuntimeException();
				}
				
                return true;
			}
		});
		
		//为 ListenableFuture 注册回调方法(callback)
		Futures.addCallback(future, new FutureCallback<Boolean>() {
			/**
			 * Callable任务执行成功时回调该方法
			 */
			@Override
			public void onSuccess(Boolean b) {
				countDownLatch.countDown();
				System.out.println("task result=" + b);
			}
			
			/**
			 * Callable任务执行出现异常时回调该方法
			 */
			@Override
			public void onFailure(Throwable ex) {
				countDownLatch.countDown();
				System.out.println(ex.toString());
			}
		});
		
		return future;
	}
}

 

分享到:
评论

相关推荐

    listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar

    java运行依赖jar包

    NIO_RandomAccessFile_多线程_按行读本地CSV文件(java==> google guava包ListenableFuture)

    NIO_RandomAccessFile_多线程读本地CSV文件(java==&gt; google guava包ListenableFuture) reader里有个main函数,更改文件路径后,直接运行即可

    guava-18.0(guava-18.0.jar和guava-18.0-sources.jar)

    `guava-18.0.jar`是Guava库的编译后的二进制版本,包含了所有Guava类和方法的字节码,开发者可以直接在项目中引用这个JAR文件来使用Guava的功能。Guava 18.0版本包含了大量实用工具,例如: 1. **集合框架扩展**:...

    guava使用方法教程

    guava 使用方法 教程

    Guava-Cache本地缓存案例代码

    本案例代码将详细介绍Guava Cache的使用,包括缓存的创建、删除、获取、失效监听、加载以及淘汰策略。 1. **缓存创建**: Guava Cache可以通过CacheBuilder类创建。CacheBuilder提供了丰富的配置选项,如最大容量...

    Guava常用类库 v33.0.0.zip

    3. **并发工具**:Guava提供了强大的并发工具,如ListenableFuture、Service和CountDownLatch,这些都是Java并发库的补充。它们简化了异步编程,使得多线程任务的管理和协调更加容易。 4. **函数式编程**:Guava...

    Guava使用培训教程

    ### Guava概述 Guava是Google推出的一款Java核心类库,旨在通过添加一系列经过充分测试且高度实用的工具集来优化Java...对于任何希望提高开发效率和代码质量的Java开发者来说,Guava都是一个值得深入学习和使用的库。

    guava-23.0.zip guava.jar guava

    4. **并发处理**:Guava提供了强大的并发工具,如ListenableFuture、CountDownLatch、CyclicBarrier等,有助于编写线程安全且高性能的代码。 5. **字符串处理**:Guava的Strings类提供了很多实用的方法,如join()...

    google-guava所需依赖包,listenablefuture-9999.0-empty-to-avoid-conflic

    这个JAR文件包含了`listenablefuture`的实现或接口定义,以便在项目中作为依赖使用,防止与其他版本的Guava或含有`ListenableFuture`实现的库发生冲突。 总结来说,这个压缩包提供了一个特殊的`ListenableFuture`...

    不加密Google Guava视频教程.txt

    ├─Google Guava 第27讲-ListenableFuture,FutureCallBack讲解.wmv ├─Google Guava 第28讲-LRU算法原理以及两种LRU算法的实现.wmv ├─Google Guava 第29讲-SoftReference,WeakReference,PhantomReference...

    Guava 工程项目包 有实例

    - **并发**:Guava 提供了更高级别的并发工具,如 ListenableFuture、Service 等,简化了异步编程和系统管理。 2. **字符串处理** - **Joiner 和 Splitter**:Guava 提供了 Joiner 和 Splitter 类,用于高效地...

    Google Guava 官方教程

    Guava 提供了并发工具,如 ListenableFuture 和 Futures,便于构建异步处理程序。它还包含一个强大的执行服务 ExecutorService,用于管理和调度线程。 4. **函数式编程** Guava 支持函数式编程风格,包括 ...

    使用google guava 实现定时缓存功能

    Guava的缓存是线程安全的,无需额外的同步措施即可在多线程环境中使用。 综上所述,Google Guava的定时缓存功能使得我们能够轻松地在Java应用中实现高效的缓存机制,有效减少计算和网络请求的负担,提升整体性能。...

    重试框架spring-retry以及guava-retry的使用

    本文将深入探讨两个常用的重试框架:Spring Retry和Guava Retry,并通过一个名为`retry-starter`的Spring Boot项目实例,来解析它们的使用方式以及差异。 首先,我们来看Spring Retry。Spring Retry是Spring框架的...

    guava多个版本jar包

    Guava是Google开发的一个Java库,它包含许多Google核心库使用的功能,如集合、缓存、并发库、原生类型支持、字符串处理、I/O等。这个压缩包包含的是Guava的不同版本,分别是guava-2.6.2.jar、guava-18.0.jar、guava-...

    google开源项目guava.jar包

    在并发编程方面,Guava提供了强大的工具,如ListenableFuture,它允许开发者注册回调函数来处理异步任务的结果,增强了异步编程的灵活性。此外,Guava的Cache模块则提供了一种内存缓存机制,可以根据预设策略自动...

    guava-21.0-rc2 、guava-21.0-rc2-javadoc 、guava-21.0-rc2-sources

    1. **guava-21.0-rc2**: 这是Guava库的二进制发行版,包含了编译好的Java类库,可以直接在项目中引用使用。21.0-rc2表示这是一个候选版本,Release Candidate,意味着这是发布前的最后一个测试版本,通常在正式发布...

    guava-19.0 jar和sources

    在Java开发中,Guava库被广泛使用,因为它包含了大量的集合框架、并发支持、缓存机制、字符串处理、I/O操作等多个方面的功能。 标题中的"guava-19.0.jar"是Guava库的19.0版本的二进制文件,包含了编译后的Java类,...

    guava-23.0-API文档-中文版.zip

    赠送jar包:guava-23.0.jar; 赠送原API文档:guava-23.0-javadoc.jar; 赠送源代码:guava-23.0-sources.jar; 赠送Maven依赖信息文件:guava-23.0.pom; 包含翻译后的API文档:guava-23.0-javadoc-API文档-中文...

    guava-20.0-API文档-中文版.zip

    赠送jar包:guava-20.0.jar; 赠送原API文档:guava-20.0-javadoc.jar; 赠送源代码:guava-20.0-sources.jar; 赠送Maven依赖信息文件:guava-20.0.pom; 包含翻译后的API文档:guava-20.0-javadoc-API文档-中文...

Global site tag (gtag.js) - Google Analytics