`

java Guava ListenableFuture实现线程回调功能

 
阅读更多
   java Future具有局限性。在实际应用中,当需要下载大量图片或视频时,可以使用多线程去下载,提交任务下载后,可以从多个Future中获取下载结果,由于Future获取任务结果是阻塞的,所以将会依次调用Future.get()方法,这样的效率会很低。很可能第一个下载速度很慢,则会拖累整个下载速度。
    Future主要功能在于获取任务执行结果和对异步任务的控制。但如果要获取批量任务的执行结果,从上面的例子我们已经可以看到,单使用 Future 是很不方便的。其主要原因在于:一方面是没有好的方法去判断第一个完成的任务;另一方面是 Future的get方法 是阻塞的,使用不当会造成线程的浪费。第一个问题可以用 CompletionService 解决,CompletionService 提供了一个 take() 阻塞方法,用以依次获取所有已完成的任务。第二个问题可以用 Google Guava 库所提供的 ListeningExecutorService 和 ListenableFuture 来解决。除了获取批量任务执行结果时不便,Future另外一个不能做的事便是防止任务的重复提交。要做到这件事就需要 Future 最常见的一个实现类 FutureTask 了。Future只实现了异步,而没有实现回调,主线程get时会阻塞,可以轮询以便获取异步调用是否完成。
   在实际的使用中建议使用Guava ListenableFuture来实现异步非阻塞,目的就是多任务异步执行,通过回调的方方式来获取执行结果而不需轮询任务状态。

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.Executors;

import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.ListeningExecutorService;
import com.google.common.util.concurrent.MoreExecutors;

public class ListenableTest {

	public static void main(String[] args) {
		ListeningExecutorService executorService = MoreExecutors.listeningDecorator(Executors.newCachedThreadPool());
		final List<Long> value = new ArrayList<Long>();
		List<ListenableFuture<Long>> futures = new ArrayList<ListenableFuture<Long>>();
		for(long i=1;i<=3;i++){
			// 处理线程逻辑
	        final ListenableFuture<Long> listenableFuture = executorService.submit(new AddCallable(1000000*(i-1)+1,i*1000000));
	        // 回调方法 
	        Futures.addCallback(listenableFuture, new FutureCallback<Long>() {
	            @Override
	            public void onSuccess(Long result) {
	            	value.add(result);
	            }
	            
	            @Override
	            public void onFailure(Throwable t) {
	                t.printStackTrace();
	            }
	        });
	        futures.add(listenableFuture);
		}
		// 阻塞三个线程执行完成
		Futures.allAsList(futures);
		long result = 0 ;
		for(int i=0,n=value.size();i<n;i++){
			result += value.get(i);
		}
		System.out.println("sum:"+result);
		executorService.shutdownNow();
	}
}

/**
 * 累加线程
 * @author 
 * @time 
 */
class AddCallable implements Callable<Long>{
	private long begin ;
	private long end ;
	
	public AddCallable(long begin,long end){
		this.begin = begin ;
		this.end = end ;
	}
	
	@Override
	public Long call() throws Exception {
		long result = 0;
		for(long i=begin;i<=end;i++){
			result += i;
		}
		return result ;
	}
}




分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    Guava Source Code 22.0

    ListenableFuture允许异步操作完成后执行回调,Service接口简化了服务的启动和停止流程,ExecutorService则提供了一种管理线程池的方式。 三、函数式编程 Guava对函数式编程的支持体现在 Predicates、Functions 和...

    guava代码展示

    10. **异步计算**:ListenableFuture接口扩展了Java的Future,增加了注册回调的能力,使得异步结果处理更加灵活。 Guava的学习笔记.docx文件可能包含了对以上概念的详细解释和示例代码,而未命名的压缩包子文件可能...

    google guava 中文教程

    ListenableFuture允许在异步操作完成后执行回调,Service接口简化了服务的启动、停止管理,而Executor服务则方便了线程池的创建和管理。 四、字符串处理 Guava提供了更高效、更简洁的字符串处理工具,如Strings类...

    guava-18.0.rar

    4. **并发支持**:Guava提供了强大的并发工具,如ListenableFuture(可监听的未来,允许异步操作的回调)、CountDownLatch(计数门限锁,用于同步多个线程)和ExecutorService(执行服务,管理线程池)。这些工具...

    guava-API文档

    例如,ListenableFuture接口允许添加回调函数,当异步操作完成时会自动触发。 4. 字符串处理:Guava包含了一些方便的字符串处理方法,如Joiner和Splitter,它们可以更方便地进行字符串的连接和分割操作。此外,...

    Getting start with guava

    - **`ListenableFuture`**:扩展了标准Java中的`Future`接口,提供了更丰富的回调机制。 - **`RateLimiter`**:用于限制执行速度,避免资源过度消耗。 ##### 4. 字符串处理 - **`Joiner`**:将集合或数组转换为...

    guava-18.rar

    ListenableFuture允许注册回调函数,当未来结果可用时会自动执行。Service接口用于管理服务的生命周期,包括启动、停止和服务状态的检查。CountDownLatch则是一种同步辅助类,用于协调多个线程的执行。 四、I/O操作...

    开源架包guava

    ListenableFuture接口允许添加回调函数,当异步任务完成时自动执行。Futures类则提供了一系列方法,用于组合、转换和管理Future对象。 Guava对原生类型的支持,如Ints、Longs和Booleans,提供了更方便的操作方法,...

    Guava 16.0 API (CHM格式)

    ListenableFuture(可监听的Future): Futures,用于异步完成的回调。  2. Service: 控制事件的启动和关闭,为你管理复杂的状态逻辑。  六. Strings: 一个非常非常有用的字符串工具类: 提供 splitting,joining,...

    guava学习知识点

    - `ListenableFuture`:异步操作完成后回调的接口,增强了 Future 的能力。 - `Service`:简化服务的启动、停止和状态管理。 7. **Strings** - 提供了丰富的字符串处理工具,如拆分、连接、填充等。 8. **...

    Java Concurrency In Practice Learning Note

    例如,`com.google.common.util.concurrent`包下提供了线程安全的`ListenableFuture`,它扩展了`Future`接口,允许添加完成时的回调,增强了异步编程的能力。此外,Guava的`LoadingCache`是缓存的实现,它支持自动...

    Google+Guava+官方教程+-+v1.1.rar

    Guava提供了许多并发工具,如ListenableFuture(可监听的未来结果,允许在异步任务完成时执行回调)、Service(服务管理接口,用于启动、停止和监控服务)和ExecutorService(执行器服务,管理线程池)。这些工具...

    future:Java、Guava 和 Scala 中的 Furures 和 promise

    Guava 的 `ListenableFuture` 更是在回调机制上提供了便利,使得我们可以根据任务完成情况触发其他逻辑。而 Scala 的 Futures 和 Promises 结合 Actor 模型,能构建出高度响应式的系统。 总之,无论是 Java、Guava ...

    Test_fconst_0.rar_The Test

    如果你有一个`ListenableFuture`实例,你可以注册回调函数,当未来任务完成(成功、失败或被取消)时,这些回调函数会被触发。这种设计模式使得代码更加异步友好,可以实现非阻塞式的事件处理,提高了程序的响应速度...

    Guava:Guava Google模块

    Guava是Google开发的一个核心库,它为Java开发人员提供了许多强大的工具和功能。这个库包含了许多实用类、集合、缓存、并发工具、原始类型支持、字符串处理、I/O等,极大地丰富了Java的标准库。Guava的目标是提高...

Global site tag (gtag.js) - Google Analytics