`
QING____
  • 浏览: 2253278 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

CompletionService简介(异步)

 
阅读更多

一.CompletionService接口提供了可以操作异步任务的功能,其唯一实现的API为ExecutorCompletionService。此API只是可以获取异步任务执行的结果,它不是ExecutorService。

其有5个核心方法:

  • Future<V> poll():同步操作,获取并移除第一已经完成的任务,否则返回null。
  • Future<V> poll(timeout):同步操作,获取并移除第一个已经完成的任务,阻塞时间为timeout,否则返回null;支持InterruptedException。
  • Future<V> submit(Callable<V> task):提交任务,并获取任务执行结果的句柄。
  • Future<V> submit(Runnable,V result):提交任务,并获取任务执行结果的句柄。
  • Future<V> take():获取并移除第一个执行完成的任务,阻塞,直到有任务返回。支持InterruptedException。

 ExecutorCompletionService之说以能够提供此功能,原因就是其内部持有一个BockingQueue(此queue可以通过构造器传入指定)。

同时这还要借助Future/FutureTask的功能。

  • public ExecutorCompletionService(Executor executor,BlockingQueue<Future<V>> completionQueue):需要指定一个现有的executor和用于存储Future的队列,此后通过submit提交的任务都将有executor来执行,并将"Future句柄"添加到队列中;这个API很像一个"修饰者".

二.Future:提供了可以查看异步执行的结果。此接口提供了多个方便的方法,以便检测和控制任务的操作。

  • boolean cancel(boolean interruptIfRunning):试图取消任务的执行,如果任务已经完成或者取消,此操作将无效。如果任务尚未启动(start),那么任务将不会被执行,如果任务正在执行,则interruptIfRunning参数决定是否中断任务线程(线程需要相应“中断”)。此方法返回后,isDone将返回true;如果方法取消成功,则isCancelled()则返回true。
  • V get():等待并获取执行结果。此方法会阻塞,知道结果返回。此方法会在线程中断时抛出InterruptException,如果任务被取消,将;抛出异常。
  • V get(timeout):阻塞指定的时间。如果时间超时,仍未能执行完成,则抛出timeoutException。

RunnableFuture接口扩展了Future接口和Runnable,只提供(覆盖)run()方法,其作用非常简单,就是标示其子类具有可执行run方法,且获取Future结果。

三.FutureTask就是RunnableFuture的子类,具有Future接口的可取消任务的能力,以及获取异步计算结果的能力。FutureTask可以认为是一个runnable和callable任务的桥梁类,其构造函数可以接受这两种任务。

  • FutureTask(Callable<V> callable) 
  • FutureTask(Runnable runnable, V result):当运行结束后,将返回指定的result。

 此外,还有几个特殊的方法:

  • protected void done():可重写的方法,当任务执行结束后,将会调用此方法执行额外的操作。
  • protected void set(V v):会被run方法内部调用,用来设置执行结果,此结果可以通过get获取。

runnable类型的任务,会在FutureTask中转化成Callable(参见Executors.callable(runnable,result),原理很简单,创建一个Callable实例,即在调用call时间接的调用run(),

并在执行结束后,返回指定的result)。

 

四.ExecutorCompletionService:提交给ExecutorCompletionService的任务,会被封装成一个QueueingFuture(一个FutureTask子类),此类的唯一作用就是在done()方法中,增加了将执行的FutureTask加入了内部队列,此时外部调用者,就可以take到相应的执行结束的任务。(take就是从blockingQueue中依次获取)

 

 

public class ExcutorComplementServiceTest {

	/**

	* @param args

	*/

	public static void main(String[] args) throws Exception{

		Executor executor = Executors.newFixedThreadPool(3);
		CompletionService<Integer> cs = new ExecutorCompletionService<Integer>(executor);
		//List<Future<Integer>> result = new ArrayList<Future<Integer>>(10);
		for(int i=0; i< 10; i++){
			cs.submit(new Callable<Integer>() {		 
				@Override
				public Integer call() throws Exception {
					Random r = new Random();
					int init = 0;
					for(int i = 0; i<100; i++){
						init += r.nextInt();
						Thread.sleep(100);
					}
					return Integer.valueOf(init);
				}
			});
		}
		for(int i=0; i<10; i++){
			Future<Integer> future = cs.take();
			if(future != null){
				System.out.println(future.get());
			}
		} 

	}

 

}
分享到:
评论

相关推荐

    ExecutorService与CompletionService对比详解.docx

    而CompletionService则是一个接口,它提供了一种更加灵活的方式来获取已完成任务的结果,尤其适用于处理多个异步任务并希望按完成顺序处理结果的场景。 首先,我们来看ExecutorService的使用。在示例中,创建了一个...

    java多线程异步性

    在Java中,通常通过Future和Callable接口实现异步计算,或者使用ExecutorService和CompletionService来管理和控制异步任务。 三、ExecutorService与ThreadPoolExecutor ExecutorService是Java并发框架中的核心接口...

    32 请按到场顺序发言—Completion Service详解.pdf

    `ExecutorService`允许我们提交任务(通常是`Runnable`或`Callable`)到线程池中进行异步执行,并通过`Future`接口获取任务的返回值。然而,当有多项任务同时执行时,`ExecutorService`默认不会按照任务完成的顺序...

    通过多线程任务处理大批量耗时业务并返回结果

    `CompletionService`是另一个关键工具,它扩展了`ExecutorService`的功能,尤其适用于需要在任务完成时立即获取结果的情况。`CompletionService`通过`Future`接口返回每个任务的结果,使得我们可以在任务完成的瞬间...

    Java利用future及时获取多线程运行结果

    使用Future和CompletionService可以实现异步计算和非阻塞的任务调用,并可以实时获取多线程运行结果。这对于Java编程中的多线程编程非常重要。 知识点: 1. 使用Future接口来实现异步计算和非阻塞的任务调用。 2. ...

    java多线程并发编程例子

    3. **CompletionService**:`CompletionService`提供了一种获取异步任务结果的机制,它基于`ExecutorService`,使得你可以按完成顺序获取结果,而不需要知道任务的原始提交顺序。`TestCompletionService.java`可能...

    JAVA课程学习笔记.doc

    - `java.util.concurrent.CompletionService`:允许获取执行任务的结果,`ExecutorCompletionService` 是其具体实现,结合了 `ExecutorService` 和 `Future`。 5. 线程池执行原理 线程池的执行过程主要包括任务提交...

    java并发(二十四)多线程结果组装

    `ExecutorService`是一个线程池服务,它可以管理和控制多个线程的执行,而`Future`代表了异步计算的结果,可以检查计算是否完成、获取结果或取消任务。`Future`接口提供了`get()`方法来获取结果,该方法会阻塞直到...

    Java并发编程实战

    第1章 简介 1.1 并发简史 1.2 线程的优势 1.2.1 发挥多处理器的强大能力 1.2.2 建模的简单性 1.2.3 异步事件的简化处理 1.2.4 响应更灵敏的用户界面 1.3 线程带来的风险 1.3.1 安全性问题 1.3.2 活跃性...

    Java 并发编程实战

    第1章 简介 1.1 并发简史 1.2 线程的优势 1.2.1 发挥多处理器的强大能力 1.2.2 建模的简单性 1.2.3 异步事件的简化处理 1.2.4 响应更灵敏的用户界面 1.3 线程带来的风险 1.3.1 安全性问题 1.3.2 活跃性...

    个人总结的深入java多线程开发

    9)已完成任务队列CompletionService 36 10)计时器CountDownLatch 37 11)周期性同步工具CyclicBarrier 38 12)异步计算的结果Future 40 13)安排线程池ScheduledExecutorService 40 五多线程面试题 41 六其他主题 41 1)...

    java.util.concurrent.uml.pdf

    CompletionService是一个接口,用于管理异步任务的完成情况。ExecutorCompletionService类是其实现,它利用线程池执行任务,并帮助开发者获取已经完成的任务结果。 Runnable和Callable是两种任务类型。Runnable是...

    线程池介绍

    另外,`CompletionService` 可以帮助管理和协调多个异步任务的完成顺序。 线程池的合理使用对于优化多线程程序的性能至关重要,需要根据系统的并发需求、任务性质等因素来选择合适的线程池类型和参数。同时,避免...

    JavaMail.rar

    10. **异步邮件处理**:JavaMail 1.6及以上版本引入了异步发送邮件的功能,通过`AsyncContext`和`CompletionService`,可以提高邮件发送的效率。 11. **SSL/TLS 安全连接**:JavaMail支持通过SSL或TLS加密连接到...

    J.U.C系列线程安全的理论讲解编程开发技术共6页.pdf

    5. **`java.util.concurrent.CompletionService`和`ForkJoinPool`**:前者提供了异步任务的完成服务,后者是基于分治策略的并行计算框架,适用于大规模并行计算。 6. **线程安全的集合**:`ConcurrentHashMap`、`...

    精通并发与Netty(共92讲)百度网盘地址.txt

    - **简介**:Netty是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。 - **特点**:高度可定制、非阻塞IO、高效内存管理等。 #### 3.2 核心组件 - **Channel**:代表...

    笔记-6、线程池1

    `CompletionService`允许获取已完成任务的结果,简化了处理多个异步任务的逻辑。 总之,理解并熟练运用线程池是Java程序员必须掌握的技能之一,它可以帮助我们构建高效、稳定的并发程序,处理大量的并发任务,同时...

    concurrent-all-in-one.pdf

    17. **CompletionService** - 提供一种方式,一旦任务完成,就获取并处理结果。 18. **线程服务的优雅停止** - 使用`shutdown()`和平稳关闭线程池,等待已提交任务完成。 - `shutdownNow()`尝试停止所有任务,...

    JAVA高质量并发详解,多线程并发深入讲解

    介绍`CompletionService`接口,以及如何使用它来管理异步任务的执行和结果。 - **第26章:使用ExecutorService停止线程服务** 讲解如何通过`shutdown`和`shutdownNow`方法来停止`ExecutorService`,并确保线程...

    JAVA并发编程实践-线程执行-学习笔记

    CompletionService是一个高级的并发工具,它结合了Executor和BlockingQueue的功能,允许处理已完成的任务,而无需等待所有任务完成。这对于处理大量并发任务并需要及时处理已完成任务的场景非常有用。 为任务设置...

Global site tag (gtag.js) - Google Analytics