Java 并发编程 Future及CompletionService

简介: Java 并发编程 Future及CompletionService`Future`用于异步结果计算。它提供了一些方法来检查计算是否完成,使用`get`方法将阻塞线程直到结果返回`CompletionService`整合了`Executor`和`BlockingQueue`的功能。将`Callable`任务提交给它去执行,使用`take()`和`poll()`获取最新完成的任务执行结果.

Future

Future用于异步结果计算。它提供了一些方法来检查计算是否完成,使用get方法将阻塞线程直到结果返回

  • cancel:尝试取消任务的执行,如果任务已完成或已取消,此操作无效
  • isCancelled:任务是否已取消
  • isDone:任务是否已完成
  • get:阻塞线程以获取计算结果,直至任务执行完毕返回结果
  • get(long timeout, TimeUnit unit):阻塞线程以获取计算结果,若在指定时间没返回结果,则返回null
public  interface  Future<V> {
   
   
    boolean cancel(boolean  mayInterruptIfRunning);
    boolean isCancelled();
    boolean isDone();
    V get() throws InterruptedException, ExecutionException;
    V get(long timeout, TimeUnit unit)
        throws InterruptedException, ExecutionException, TimeoutException;
}

Future结合线程池的使用

public void futureTest(){
   
   
    ExecutorService executorService = Executors.newFixedThreadPool(10);

    Future<String> nickFuture = executorService.submit(() -> userService.getNick());
    Future<String> nameFuture = executorService.submit(() -> userService.getUserName());

    // 阻塞开始,等待结果
    String nick = nickFuture.get(1000, TimeUnit.MILLISECONDS);
    String name = nameFuture.get();
}

CompletionService

CompletionService整合了ExecutorBlockingQueue的功能。将Callable任务提交给它去执行,使用take()poll()获取最新完成的任务执行结果.

ExecutorCompletionService是该接口的实现类,内部有一个线程池和BlockingQueue队列。它的实现原理其实挺简单:每个提交给ExecutorCompletionService的任务,都会被封装成一个QueueingFutureFutureTask的子类),它重写了done()方法(该方法会在任务执行完成之后回调),将执行完成的FutureTask加入到内部队列,take()poll()将得到最新完成的结果FutrueTask

使用方法

注:若线程池为局部变量,使用完后需关闭线程池。或直接使用全局变量命名的线程池

public Map<Long, List<String>> batchDoGetLiveRecord(List<LiveRecordReqDTO> reqList) {
   
   
    Map<Long, List<String>> recordMap = Maps.newHashMap();
    // 用线程池executor新建一个CompletionService
    CompletionService<Map<Long, List<String>>> completionService = new ExecutorCompletionService<>(executor);

    try {
   
   
        for (LiveRecordReqDTO req : reqList) {
   
   
            completionService.submit(() -> doGetLiveRecordAsMap(req));
        }

        for (int i = 0; i < reqList.size(); i++){
   
   
            Map<Long, List<String>> map = completionService.take().get(1000, TimeUnit.MILLISECONDS);
            recordMap.putAll(map);
        }
    } catch (Exception e) {
   
   
        logger.warn("batchDoGetLiveRecord fail, uidList:{}, bizId:{}",reqList, bizId, e);
    } finally {
   
   
        completionService.shutdown();
    }

    return recordMap;
}

类图自[CompletionService和ExecutorCompletionService详解](https://imgconvert.csdnimg.cn/aHR0cHM6Ly93d3cuamlhbnNodS5jb20vcC9jZmRhNzA4YTM0Nzg?x-oss-process=image/format,png)
类图自CompletionService和ExecutorCompletionService详解


参考资料:

  1. CompletionService和ExecutorCompletionService详解
  2. 并发处理利器-CompletionService
相关文章
|
15小时前
|
安全 Java API
Java中的并发编程:掌握现代软件开发的关键
【2月更文挑战第13天】 在当今高速发展的软件行业中,多线程和并发编程已成为Java开发者不可或缺的技能。本文将深入探讨Java并发编程的核心概念、关键技术和最佳实践。我们将从并发编程的基础出发,逐步深入到线程管理、同步机制以及并发工具类的应用,旨在为读者构建一个全面、系统的Java并发编程知识框架。通过实例驱动的方式,本文将帮助读者理解并发编程的复杂性,掌握实现高效、稳定并发Java应用的技巧。
|
15小时前
|
Java 程序员 API
Java 8新特性探索:让编程更加高效与简洁
【2月更文挑战第13天】随着技术的不断进步,Java语言也在不断地发展和完善。Java 8的推出,被认为是Java历史上最具革命性的版本之一。本文将深入探讨Java 8引入的几个关键新特性,包括Lambda表达式、Stream API、新的日期时间API以及Optional类的使用。通过具体的代码示例和分析,我们将展示这些新特性如何帮助开发人员编写更加简洁、易读、高效的代码。此外,文章还将探讨这些新特性对Java生态系统和未来版本的影响,旨在为Java开发者提供一个全面的Java 8新特性指南,帮助他们充分利用这些新工具,提升开发效率和程序质量。
|
1天前
|
安全 Java 开发者
Java中的并发编程:探索线程安全与锁机制
【2月更文挑战第12天】 本文深入探讨Java并发编程的核心概念,特别是线程安全和锁机制。不同于传统的技术文章摘要,我们将通过一个实际案例来展开讨论,即如何在多线程环境下保证数据的一致性和完整性。我们将从基础的线程概念入手,逐步深入到synchronized关键字、显式锁(如ReentrantLock),以及其他并发工具类(如CountDownLatch、CyclicBarrier等)的应用。通过本文,读者不仅能够掌握Java并发编程的理论知识,还能了解到如何在实际开发中合理地应用这些并发机制,以提升应用程序的性能和稳定性。
8 2
|
1天前
|
Java
Java中的并发编程:理解并应用线程池
【2月更文挑战第12天】 在软件开发的世界里,提升程序性能和资源利用率是一个永恒的追求。随着多核处理器的普及,利用并发编程成为了实现这一目标的关键手段之一。Java,作为一门在企业级应用开发中广泛使用的语言,提供了丰富的并发编程工具。本文将深入探讨Java中的线程池机制,这是实现高效并发编程的核心技术之一。通过本文,读者不仅可以理解线程池的工作原理和关键概念,还能学习到如何在实际项目中正确地应用线程池来提升程序的性能和响应速度。
10 3
|
1天前
|
安全 Java 程序员
Java中的并发编程:掌握同步机制与线程安全
【2月更文挑战第12天】 在现代软件开发领域,多线程和并发编程已成为提高应用性能和资源利用率的关键技术。Java语言提供了丰富的并发编程工具和框架,使得开发高效、可靠的并发应用成为可能。本文将深入探讨Java中的并发编程,着重介绍同步机制、线程安全概念及其在实际开发中的应用。通过对这些知识点的深入分析和案例演示,旨在帮助读者建立起对Java并发编程的全面理解,从而更好地设计和实现线程安全的高并发系统。
|
2天前
|
Java API UED
Java中的并发编程探索:理解与应用
【2月更文挑战第11天】 在现代软件开发领域,提高程序性能和效率已成为核心目标之一。并发编程作为实现这一目标的关键技术,尤其在Java语言中,拥有丰富的API和框架支持。本文将深入探讨Java并发编程的基础概念、关键技术以及常见问题和解决策略。通过对Thread类、Runnable接口、synchronized关键字、Lock接口、Executor框架等核心组件的分析,我们旨在为读者提供一个清晰、系统的并发编程知识框架。此外,文章还将通过案例分析,展示如何在实际项目中合理应用这些并发编程技术,以优化程序性能,提升用户体验。
10 1
|
2天前
|
Java API 开发者
Java 8中的Lambda表达式:革新你的编程方式
【2月更文挑战第11天】 在本文中,我们将深入探讨Java 8引入的一个重要特性:Lambda表达式。这一创新不仅仅是对Java语言的一次更新,它代表了一种编程范式的转变,让开发者能够以更加简洁、功能强大的方式编写代码。通过本文,读者将了解Lambda表达式的基本概念、它如何简化代码、提高开发效率,以及在实际开发中如何正确使用Lambda表达式来处理常见的编程任务。我们将通过示例代码和比较分析,展示Lambda表达式的优势,并讨论其对Java生态系统的长远影响。无论你是Java新手还是有经验的开发者,本文都将为你揭示Lambda表达式如何革新你的编程方式。
|
2天前
|
Java
Java并发编程中的死锁问题及解决方法
【2月更文挑战第11天】 在Java并发编程中,死锁是一个常见但又非常棘手的问题。本文将深入探讨死锁的概念、产生原因以及常见的解决方法,帮助读者更好地理解并发编程中的挑战,并提供实用的解决方案。
14 6
|
2天前
|
Java API
Java中的并发编程:挑战与应对
【2月更文挑战第11天】 在当今软件开发领域,多核处理器的普及使并发编程成为开发人员需要面对的重要挑战之一。本文将深入探讨Java中的并发编程,介绍常见的并发编程问题及解决方案,帮助开发人员更好地理解并发编程的复杂性,并掌握有效的应对策略。
|
3天前
|
SQL Java 数据库连接
Java的JDBC编程
Java的JDBC编程

相关产品

  • 云迁移中心